【问题标题】:Django Rest Framework - serializing a ManyToManyField with the default 'through'Django Rest Framework - 使用默认的“通过”序列化 ManyToManyField
【发布时间】:2017-06-30 21:52:09
【问题描述】:

您好,我是 DRF 的新手,我可以使用外键序列化表,但是当涉及到多对多字段时,在这种情况下:

包装 Package_product_atom Product_atom

我将如何进行序列化?到目前为止,我正在尝试的是:

class Product_atomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product_atom
        ready_only = True
        fields = ('id','title', 'title_override', 'price', 'price_override', 'description', 'description_override','image', 'image_override' ,'tags', 'product_alt', 'date_modified', 'date_created')

class PackageSerializer(serializers.ModelSerializer):
    atomics = Product_atomSerializer(many=True)
    class Meta:
        model = Package
        ready_only = True
        fields = ('id', 'title', 'price', 'discount', 'image', 'tags', 'atomics', 'date_modified', 'date_created')

我的模型是:

class Product_atom(models.Model):

    title = models.CharField(max_length=255, blank=False)
    title_override = models.BooleanField(default=False, blank=False)
    price = models.SmallIntegerField(default=0, blank=False)
    price_override = models.BooleanField(default=False, blank=False)
    description = models.TextField(blank=True)
    description_override = models.BooleanField(default=False, blank=False)
    image = models.ImageField(upload_to = 'uploads', default = '', blank=True)
    image_override = models.BooleanField(default=False, blank=False)
    tags = models.CharField(max_length=255, blank=False)
    active = models.BooleanField(default=True, blank=False)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
    product_alt = models.ForeignKey(Product_alt, related_name='atomics', on_delete=models.CASCADE)
    default_provider = models.ForeignKey(Provider, on_delete=models.CASCADE)

    def __str__(self):
        return "{}".format(self.title)

class Package(models.Model):

    title = models.CharField(max_length=255, blank=False)
    price = models.SmallIntegerField(default=0, blank=False)
    discount = models.SmallIntegerField(default=10, blank=False)
    image = models.ImageField(upload_to = 'uploads', default = '', blank=True)
    tags = models.CharField(max_length=255, blank=False)
    active = models.BooleanField(default=True, blank=False)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
    zone = models.ForeignKey(Zone, on_delete=models.CASCADE)
    product_atom = models.ManyToManyField(Product_atom)

    def __str__(self):
        return "{}".format(self.title)

如果它是 ForeignKey 关系,这会起作用,但我无法使用 ManyToManyField 运行它,我得到的错误是:

AttributeError:尝试在序列化程序 PackageSerializer 上获取字段 atomics 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 Package 实例上的任何属性或键都不匹配。 原始异常文本是:“包”对象没有属性“原子”。

我之前在序列化一对多关系时遇到了这个错误,但使用related_name 修复了它。将自定义模型使用 through 并添加相关名称来修复它吗?谢谢!

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    您是否尝试过将变量名“atomics”更改为“product_atom”?

    根据您的 Package 类,“product_atom”没有相关名称“atomics”。

    【讨论】:

    • 那个.... 成功了!哈哈哈,但我不知道为什么它不适用于原子,因为我在其上设置了相关名称
    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多