Django 如何为规范化数据库构建序列化程序

Django 如何为规范化数据库构建序列化程序,django,django-rest-framework,Django,Django Rest Framework,也许我的问题已经被回答了,但我什么也找不到。 假设我使用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

也许我的问题已经被回答了,但我什么也找不到。 假设我使用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文档,但不了解如何进行此类操作。

您可以使用:


但是我相信你的模型是相反的,如果你想把鞋的尺寸作为一个实例,那么也许
尺寸
应该是鞋上的fk
模型?如果是这种情况,只需反转序列化器。

一只鞋有很多尺寸可用,因此每个尺寸实体都有一个鞋id作为fk和一个数字尺寸,对吗?我将阅读有关嵌套关系的内容,谢谢。因此,如果鞋子可以有很多尺寸(有意义),则需要一个
ManyToMany
字段。否则,您将需要为每个鞋对象创建相同的鞋尺寸。将鞋子fk放在尺码模型上,并在鞋子模型上添加一个字段
available\u size=models.ManyToManyField(尺码)
。这样,您只需调用my_show_instance.available_size.add(new_size)`添加新的尺码即可。对于一款特殊的鞋,除了有很多尺码的现货外,每种尺码都有一定的可用量。我认为我构建模型的方式是正确的。没有必要使用mtm,我的尺码表中有很多“7.5”,但每一个都对应于其各自的鞋子,并且有正确的库存量。哦,在这种情况下,我认为您应该使用新的型号来添加鞋子型号和尺码,并带有数量字段。只是为了让你保持稳定。不要太担心有很多模型。拥有不必要的模型是不好的。但是,仅仅为了保存一个模型而进行糟糕的模型设计也是不好的。我不是说你的方法不好,但从建模的角度来看,我会有一个模型来跟踪库存,一个模型用于鞋子本身,还有一个模型用于鞋子的尺寸和其他属性。
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__'