Django rest API, вложенный сериализатор добавлять / редактировать несколько изображений недвижимости в один список? - PullRequest
0 голосов
/ 25 февраля 2020

Я довольно застрял, работая с DRF впервые. Я хочу загрузить несколько изображений в один листинг недвижимости.

Моя модель изображения

class Image(models.Model):      
    photo = models.ImageField(blank=True, upload_to=get_image_filename)
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE)

my serial, Listing и Listing detail serializer

class ListingSerializer(serializers.HyperlinkedModelSerializer):      
    image_set = ImageSerializerForListingDetail(many=True, required=False)

    class Meta:                  
        model = Listing                  
        fields = ['url', 'address', 'image_set', ]   

class ListingDetailSerializer(serializers.HyperlinkedModelSerializer):          
    user = AccountSerializer(read_only=True)          
    image_set = ImageSerializerForListingDetail(many=True, required=False)      

    class Meta:                  
        model = Listing                  
        fields = '__all__'                  
        depth = 1   

class ImageSerializerForListingDetail(serializers.ModelSerializer):          
image_url = serializers.SerializerMethodField()      

    class Meta:                  
        model = Image                  
        fields = ('image_url', ) 

    def get_image_url(self, listing): 
        return listing.photo.url 

Мой взгляд

class ListingViewSet(viewsets.ModelViewSet):          
    queryset = Listing.objects.all()          
    serializer_class = ListingSerializer              
    detail_serializer_class = ListingDetailSerializer          
    permission_classes = [IsOwnerOrReadOnly, ]       

    '''Show detailed Listing view'''      
    def get_serializer_class(self):          
        if self.action == 'retrieve':              
            if hasattr(self, 'detail_serializer_class'):              
                return self.detail_serializer_class                  
        return super(ListingViewSet, self).get_serializer_class() 

У меня проблемы с выяснением того, как загрузить / отредактировать несколько изображений в один листинг и где их переопределить. Я хотел бы, чтобы это было возможно при создании и редактировании списков. Любая помощь очень ценится. Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Кажется, что это должно сработать, и тогда мне все еще нужно поработать над методом обновления.

class ListingSerializer(serializers.HyperlinkedModelSerializer):
    user = UsernameSerializer(read_only=True)
    image_set = ImageSerializerForListingDetail(many=True, required=False, 
                                                read_only=True)

    class Meta:
        model = Listing
        exclude = ('url', )
        depth = 1

    def create(self, validated_data):
        images_data = validated_data.pop('image_set')
        listing = Listing.objects.create(**validated_data)
        for image_data in images_data:
            Image.objects.create(listing=listing, **image_data)
        return listing

Есть ли что-то особенное, что мне нужно сделать с изображениями, что мое большое беспокойство ? Я всегда думал, что мне нужно запросить. ФАЙЛЫ, но я вижу, что это было амортизировано в DRF 3?

0 голосов
/ 25 февраля 2020

В этом конкретном c сценарии использования есть раздел, выделенный в документации для «Вложенных объектов, доступных для записи»

https://www.django-rest-framework.org/api-guide/serializers/#writable -nested-представления

Если вы поддерживаете возможность записи вложенных представлений, которые вам понадобятся для написания методов .create () или .update (), которые обрабатывают сохранение нескольких объектов.

do c должен охватывать соответствующий пример, который вы ищете!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...