Django Rest Framework POST и PUT Внешний ключ ModelSerializer - PullRequest
0 голосов
/ 19 октября 2018

У меня проблема с модельным сериализатором.Мои модели

class ItemState(models.Model):
"""Status for a item"""
name = models.CharField(max_length=255, null=True, blank=True)

class Item(models.Model):
    title = models.CharField(max_length=255)
    status = models.ForeignKey(ItemState, on_delete=models.CASCADE)

Мой сериализатор:

class ItemStateSerializer(serializers.ModelSerializer):
    class Meta:
        model = ItemState
        fields = '__all__'


class ItemSerializer(serializers.ModelSerializer):
    status = ItemStateSerializer(read_only=True)
    class Meta:
        model = Item
        fields = '__all__'

И мой просмотр

class ItemViewSet(viewsets.ModelViewSet):
    """ Item view set """
    queryset = Item.objects.all()
    serializer_class = ItemSerializer
    permission_classes = (IsOwnerOrAdmin, )

Мой вопрос, как я могу сделать пут или пост без созданиястатус объекта?Я хочу заменить это

HTTP PUT 
{
   "title": "example",
   "status": {
       "id": 1,
       "name": "hello"
   }
}

этим

HTTP PUT 
{
   "title": "example",
   "status": 1
}

Спасибо сообществу!

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вы можете использовать два поля сериализатора для одного и того же поля модели - одно для деталей, а другое по умолчанию с идентификатором ( см. Этот ответ ).Таким образом, в вашем случае ваш сериализатор может быть определен как:

class ItemSerializer(serializers.ModelSerializer):
    status_detail = ItemStateSerializer(source='status', read_only=True)

    class Meta:
        model = Item
        fields = '__all__'

Теперь ваши запросы PUT будут такими, как вы хотите:

HTTP PUT 
{
   "title": "example",
   "status": 1
}

, но когда вы получаете Item, онбудет иметь ItemState подробности в поле status_detail:

HTTP GET
{
   "title": "example",
   "status": 1
   "status_detail": {
       "id": 1,
       "name": "hello"
   }
}
0 голосов
/ 19 октября 2018

Вы хотите оставить другой класс или вы можете избавиться от всего этого вместе?Кажется, проще сделать:

class Item(models.Model):
    title = models.CharField(max_length=255)
    status = models.CharField(max_length=255)  # or you can change to int if you want
...