【问题标题】:Serialize Many to Many Relationship with Extra fields使用额外字段序列化多对多关系
【发布时间】:2018-06-06 03:52:32
【问题描述】:

请我一直在试图解决这个问题。看看其他类似的问题后,我想我没有得到一些东西。

我有这些模型:

class Dish(BaseModel):
    class Meta:
        verbose_name_plural = 'dishes'
    name = models.CharField(_('dish'), max_length=100)
    dish_type = models.CharField(_("dish type"), max_length=100)
    price = models.PositiveIntegerField(_("price"))

    def __str__(self):
        return f"{self.name} costs {self.price}"


class Order(BaseModel):

    dishes = models.ManyToManyField(Dish, through='DishOrder')
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    discount = models.PositiveIntegerField(_("total discount"), blank=True)
    total = models.PositiveIntegerField(_("total"), blank=True)
    shipping = models.PositiveIntegerField(_("shipping cost"), blank=True)
    grand_total = models.PositiveIntegerField(_("grand total"), blank=True)
    country = models.CharField(_('country code'), max_length=2)

    def __str__(self):
        return f"order from {self.customer} at {self.total}"

    def get_absolute_url(self):
        return reverse('order-details', kwargs={'pk': self.pk})


class DishOrder(models.Model):
    dish = models.ForeignKey(Dish, on_delete=models.CASCADE, related_name='dishes')
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='dishes')
    quantity = models.PositiveIntegerField(_("quantity"))
    discount = models.PositiveIntegerField(_("discount"))
    price = models.PositiveIntegerField(_('price'))

相应的序列化器如下:

class DishOrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = DishOrder
        fields = (
            "quantity",
            "discount",
            "price"
        )

class OrderSerializer(serializers.ModelSerializer):
    dishes = DishOrderSerializer(source='dish', many=True)
    class Meta:
        model = Order
        fields = (
            "id",
            "country",
            "customer",
            "dishes", 
            "total", 
            "discount",
            "grand_total",
            "voucher"
        )

可以看出,我通过一个直通表建立了 m2m 关系。但是我无法让序列化程序工作。这是我不断收到的错误:

尝试获取字段 dishes 的值时出现 AttributeError 在序列化程序OrderSerializer 上。序列化器字段可能被命名 不正确且不匹配 Order 上的任何属性或键 实例。原始异常文本是:“订单”对象没有属性 '菜'。

我已经查看了一段时间,试图找出错误是什么。我将不胜感激任何帮助

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    由于您在模型中使用related_name='dishes',您应该使用dishes 作为多对象对象的源:

    class OrderSerializer(serializers.ModelSerializer):
        dishes = DishOrderSerializer(source='dishes', many=True)
    

    或简单:

    class OrderSerializer(serializers.ModelSerializer):
        dishes = DishOrderSerializer(many=True)
    

    因为source='dishes' 是多余的,以防您也将序列化程序的字段命名为dishes

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2017-08-24
      相关资源
      最近更新 更多