【问题标题】:Django Rest Framework Get Additional related fields in one to many relationDjango Rest Framework 以一对多关系获取其他相关字段
【发布时间】:2019-02-09 11:14:40
【问题描述】:

这是问题产品有多种尺寸,这是多对多的关系

产品

|-------|---------|
|   ID  |  Title  |
|-------|---------|

尺寸

|-------|---------|
|   ID  |  Title  |
|-------|---------|

大小通过

|------|--------------|-----------|---------|
|  ID  |  Product ID  |  Size ID  |  Stock  |
|------|--------------|-----------|---------|

我设法使用 Django Rest Framework 在我的产品 api 中获取尺寸,但我也不知道如何获取库存信息。 这是我的代码

class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'title',
        )
        model = Size



class ProductsSerializer(serializers.ModelSerializer):
    sizes = SizeSerializer(many=True)

    class Meta:
        fields = (
            'url',
            'id',
            'title',
            "sizes",
        )
        model = Products

如果能在这个问题上提供任何帮助,我将不胜感激

模型

class Products(models.Model):
    title = models.CharField(max_length=125)
    sizes = models.ManyToManyField(Size, blank=True, through='SizeThrough')

    class Meta:
        verbose_name_plural = 'Products'
        verbose_name = 'Product'

    def __str__(self):
        return self.title

class SizeThrough(models.Model):
    size = models.ForeignKey(Size, on_delete=models.CASCADE)
    product = models.ForeignKey(Products, on_delete=models.CASCADE)
    stock = models.BooleanField(null=False, default=1)

class Size(models.Model):
    title = models.CharField(max_length=20)

    def __str__(self):
        return self.title

【问题讨论】:

  • 可以添加相关型号吗?
  • @JPG 刚刚添加了模型
  • @Hayden 我已经经历了很多次我只发现 "ManyToManyFields with a Through Model" 这是最后一节,但我没有提供更多信息。

标签: django django-models django-rest-framework many-to-many


【解决方案1】:

你可以试试这个。也许它有效

class ProductsSerializer(serializers.ModelSerializer):
    sizes = SizeSerializer(many=True)
    stock = serializers.SerializerMethodField()

    def get_stock(self, obj):
         return[(x.stock, x.size) for x in SizeThrough.objects.filter(product=obj)]

    class Meta:
        fields = (
        'url',
        'id',
        'title',
        "sizes",
        "stock",
    )
        model = Products

【讨论】:

    【解决方案2】:

    你应该通过SizeThrough得到Size(你正在尝试相反的事情):

    class SizeSerializer(serializers.ModelSerializer):
        class Meta:
            fields = (
                'id',
                'title',
            )
            model = Size
    
    
    class SizeThroughSerializer(serializers.ModelSerializer):
        size = SizeSerializer()
        class Meta:
            fields = (
                'stock',
                'size',
            )
            model = SizeThrough
    
    
    class ProductsSerializer(serializers.ModelSerializer):
        sizes_info = SizeThroughSerializer(source='sizethrough_set', many=True)
    
        class Meta:
            fields = (
                'url',
                'id',
                'title',
                "sizes_info",
            )
            model = Products
    

    【讨论】:

    • 这是我在尝试获取序列化程序sizes_info 上的字段ProductsSerializer 的值时从这个“得到属性错误”得到的结果。序列化程序字段可能命名不正确,并且与任何属性或键不匹配Products 实例。原始异常文本是:'Products' 对象没有属性 'Sizethrough_set'。"
    • 刚刚将答案更改为source='sizethrough_set'
    猜你喜欢
    • 2023-03-14
    • 2017-04-20
    • 2017-07-08
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多