Сериализация многие ко многим Связь с дополнительными полями - PullRequest
0 голосов
/ 05 июня 2018

Пожалуйста, я застрял, пытаясь обойти эту проблему.Думаю, что-то, что я не получаю после просмотра других подобных вопросов.

У меня есть эти модели:

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 через сквозную таблицу.Однако я не могу заставить сериализатор работать.Это ошибка, которую я продолжаю получать:

Получил AttributeError при попытке получить значение для поля dishes на сериализаторе OrderSerializer.Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре Order.Исходный текст исключения был: объект «Порядок» не имеет атрибута «блюдо».

Я какое-то время просматривал это, пытаясь выяснить, в чем заключается ошибка.Я буду признателен за любую помощь

1 Ответ

0 голосов
/ 05 июня 2018

Поскольку вы используете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...