Как создать сериализатор для нормализованной базы данных - PullRequest
2 голосов
/ 23 мая 2019

Возможно, на мой вопрос уже ответили, но я не смог ничего найти.Допустим, я создаю систему инвентаризации, используя Django + Django REST для бэкэнда.Для этого у меня есть две модели:

class Shoe(models.Model):
   _id = models.AutoField(primary_key=True)
   description = models.CharField(null=False, blank = False)
   provider = models.CharField(null=False, blank=False)
   category = models.CharField(choices=CATEGORIES, null=False, blank=False)

class Sizes(models.Model):
   shoe_id = models.ForeignKey(Shoe, on_delete=models.CASCADE)
   size = models.IntegerField(choices=SIZE_LIST, null=False, blank=False)
   amount = models.IntegerField(null=False,default=0)

Я сомневаюсь, как я могу (используя ModelViewSet, потому что основанный на моем опыте с DRF самый простой способ) обслуживать файлы JSON следующим образом:

[
    {
        "_id": "1",
        "description": "Air Max Black",
        "provider": "NIKE",
        "category": "Casual",
        "available_sizes": {36: 400, 37: 250}, #size: amount
        "amount": "650"                        #total amount
    },
]

Исходя из того, что я понимаю в DRF, чтобы "объединить" две модели в JSON, я должен написать собственный сериализатор, верно?Обычно мои сериализаторы похожи на

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = Foo
        fields = ['some_stuff_here']

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

1 Ответ

3 голосов
/ 23 мая 2019

Вы можете просто использовать вложенное отношение :

class ShoeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Shoe
        fields = '__all__' # all for all fields, or a tuple with the fields


class SizeSerializer(serializers.ModelSerializer):
    shoe = ShoeSerializer(many=True, read_only=True)

    class Meta:
        model = Size
        fields = '__all__'

Но я полагаю, что ваша модель перевернута, может быть size должна быть модель fk на shoe, если вы хотите привести размер экземпляра обуви? Если это так, просто инвертируйте сериализаторы.

...