Django Rest Framework, как назначать значения вручную (без данных) для реляционных полей - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть такая модель:

class Listing(...):
   ...

class ListingImage(...):
   listing = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name='images')
   ...

и поле сериализатора для отображения изображений:

class ListingImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ListingImage
        fields = ('id', ..., 'listing')
    ...

Мои URL-маршруты настроены следующим образом:

POST /v1/listings/:listing_id/images

в представлении, я получаю список на основе параметра пути:

def upload_photo_to_listing(request, listing_id):
    listing = Listing.objects.get(pk=listing_id)
    data = request.data.copy()
    data['listing'] = listing

    serializer = ListingImageSerializer(
        data=data, context={'request': request})
    if serializer.is_valid(raise_exception=True):
        serializer.save()
        return Response({'data': serializer.data}, status.HTTP_201_CREATED)

Это работает нормально (для простоты удалена обработка ошибок);тем не менее, я не люблю мутировать request.data (или копировать и изменять его).При использовании оригинального объекта я могу сделать что-то вроде этого:

ListingImageSerializer(someListingImageObject, data=data, ...)

Можно ли сделать что-то похожее на него, но вместо оригинальных объектов фактически передать соответствующее поле?

1 Ответ

0 голосов
/ 26 февраля 2019

Передайте идентификатор объекта, относящегося к списку, непосредственно в json, например

{
     "id" : 1,
     "listing" : 1
}

Теперь в views.py

def upload_photo_to_listing(request, listing_id):
    listing = Listing.objects.get(pk=listing_id)
    data = request.data

    serializer = ListingImageSerializer(
        data=data, context={'request': request})
    if serializer.is_valid(raise_exception=True):
        serializer.save()
    return Response({'data': serializer.data}, status.HTTP_201_CREATED)
...