如何在 DRF 中为图像字段创建单独的 POST 请求

How to create seperate POST request for imagefield in DRF

我需要为图像文件制作一个单独的 API。我怎样才能做到这一点?

models.py

class Organization(models.Model):
    code = models.CharField(max_length=25, null=False, unique=True)
    name = models.CharField(max_length=100, null=False)
    location = models.ForeignKey(Location, on_delete=models.RESTRICT)
    description = models.TextField()
    total_of_visas = models.IntegerField(null=False, default=0)
    base_currency = models.ForeignKey(Currency, on_delete=models.RESTRICT)
    logo_filename = models.ImageField(upload_to='uploads/')

serializers.py

class OrganizationSerializer(serializers.ModelSerializer):
    location = serializers.CharField(read_only=True, source="location.name")
    base_currency = serializers.CharField(read_only=True, source="base_currency.currency_master")
    location_id = serializers.IntegerField(write_only=True, source="location.id")
    base_currency_id = serializers.IntegerField(write_only=True, source="base_currency.id")

    class Meta:
        model = Organization
        fields = ["id", "name", "location", "mol_number", "corporate_id", "corporate_name",
                  "routing_code", "iban", "description", "total_of_visas", "base_currency", "logo_filename",
                  "location_id", "base_currency_id"]

    def validate(self, data):
        content = data.get("content", None)
        request = self.context['request']
        if not request.FILES and not content:
            raise serializers.ValidationError("Content or an Image must be provided")
        return data

    def create(self, validated_data):
        ....

    def update(self, instance, validated_data):
        ....
        

views.py

class OrganizationViewSet(viewsets.ModelViewSet):
    queryset = Organization.objects.all()
    serializer_class = OrganizationSerializer
    lookup_field = 'id'

urls.py

router = routers.DefaultRouter()
router.register('organization', OrganizationViewSet, basename='organization')
urlpatterns = [
    path('', include(router.urls)),
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我不知道如何向邮递员发出 POST 图像字段请求。我被困在这里很长时间了。感谢任何帮助。

如果你想单独更新图像字段,你只需要为它创建一个单独的序列化程序

 class OrganizationImageSerializer(serializers.ModelSerializer):
        logo_filename = serializers.ImageField()
        class Meta:
            model = Organization
            fields = ["logo_filename"]

view.py

class OrganizationImageView(generics.UpdateAPIView):# or `generics.RetrieveUpdateAPIView` if you also want to retriev the current one before updating it
    serializer_class = OrganizationImageSerializer
    permission_classes = [IsAuthenticated, ]

    def get_queryset(self):
        queryset = Organization.objects.filter(id=self.kwargs['pk'])
        return queryset

urls.py

from .views import OrganizationImageView

urlpatterns = [
...
 path('update_org/<int:pk>', OrganizationImageView.as_view(), name='OrganizationImageUpdater'),
]