簡體   English   中英

Django Rest Framework-使用默認的'through'序列化ManyToManyField

[英]Django Rest Framework - serializing a ManyToManyField with the default 'through'

您好,我是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的值時,出現atomics 序列化程序字段的名稱可能不正確,並且與Package實例上的任何屬性或鍵都不匹配。 原始異常文本為:“包裝”對象沒有屬性“原子”。

序列化一對多關系之前,我遇到了這個錯誤,但是使用related_name修復了它。 是否會通過使用放置自定義模型並向其中添加related_name來解決問題? 謝謝!

您是否嘗試過將變量名“ atomics”更改為“ product_atom”?

根據您的Package類,“ product_atom”沒有相關名稱“ atomics”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM