首页 > 解决方案 > 如何为规范化数据库构建序列化程序

问题描述

也许我的问题已经得到解答,但我找不到任何东西。假设我使用 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 文档,但无法理解如何做这样的事情。

标签: djangodjango-rest-framework

解决方案


您可以只使用嵌套关系

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如果是这种情况,只需反转序列化程序。


推荐阅读