Я довольно новичок в разработке API с django инфраструктурой отдыха. Я работал над задачей около недели. Я чувствую, что все ближе, но все еще сталкиваюсь с проблемами. У меня есть модель Listing
и модель Image
. Каждый список может иметь несколько изображений. Моя Image
модель имеет только два поля: photo
, которое является полем изображения, и listing
, которое является ForeignKey
списком
Мои сериализаторы выглядят как
class ImageSerializerForListingDetail(serializers.ModelSerializer):
class Meta:
model = Image
fields = ('photo', )
def get_image_url(self, listing):
return listing.photo.url
`
class ListingSerializer(serializers.HyperlinkedModelSerializer):
user = UsernameSerializer(read_only=True)
image_set = ImageSerializerForListingDetail(many=True, required=False)
class Meta:
model = Listing
exclude = ('url', )
depth = 1
def create(self, validated_data):
images_data = self.context.get('view').request.FILES
listing = Listing.objects.create(**validated_data)
for image_data in images_data.values():
Image.objects.create(photo=image_data, listing=listing)
return listing
def update(self, instance, validated_data):
images_data = validated_data.pop('image_set')
images = instance.image_set.all()
images = list(images)
instance = validated_data.get(**validated_data)
instance.save()
for image_data in images_data:
image = images.pop(0)
image.photo = image_data.get('photo')
image.listing = image_data.get('listing')
image.save()
return instance
Мой ViewSet выглядит следующим образом ...
class ListingViewSet(viewsets.ModelViewSet):
queryset = Listing.objects.all().order_by('id')
permission_classes = [IsOwnerOrReadOnly, ]
serializer_classes = {
'list': ListingListSerializer,
'retrieve': ListingSerializer
}
default_serializer_class = ListingSerializer
def get_serializer_class(self):
return self.serializer_classes.get(self.action, self.default_serializer_class)
Я проверяю запрос PATCH в почтальоне, но у меня ошибка,
images_data = validated_data.pop('image_set')
KeyError: 'image_set'
Любая помощь, чтобы получить этот запрос исправления исправлена, поэтому пользователь может создавать / редактировать изображения для каждого списка будет принята с благодарностью. Спасибо всем! (отредактировано)