简体   繁体   中英

How to create seperate POST request for imagefield in DRF

I need to make a separate API for the image file. How can I achieve this?

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)

I don't have idea how to make POST request for image field from postman. I've been stuck here for a long time. Any help is appreciated.

if you want to update the image field separately you just have to create a separate serializer for it

 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'),
]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM