Django ORM: самоотдача многих ко многим с помощью сквозной модели - PullRequest
0 голосов
/ 22 марта 2019

У меня есть отношения со многими ссылками на себя, которые включают сквозную модель.Продукты состоят из других продуктов, в том числе количество (т. Е. Винт сделан из железных прутьев).Я сделал сквозную модель, хотя я не могу получить доступ к полю «сумма» в сквозной модели:

Код модели:

from django.db import models


class Product(models.Model):
    name = models.CharField(max_length=200, unique=True)
    produced = models.IntegerField(default=0)
    speed = models.IntegerField()
    type = models.CharField(max_length=200)
    ingredients = models.ManyToManyField('self', through='RecipeComponent', symmetrical=False)

    def __str__(self):
        return self.name


class RecipeComponent(models.Model):
    item = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="item")
    ingredient = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="ingredient")
    amount = models.IntegerField()

    def __str__(self):
        return str(self.amount) + " of " + self.ingredient.name

I 'Мы пробовали ряд других запросов, но, как вы видите, они, похоже, не сработали.Я знаю, что что-то упустил, но не могу понять, что это.

screw.ingredients.all()
>>> <QuerySet [<Product: iron_rod>]>
screw.ingredients.all()[0].amount
>>> Traceback (most recent call last):
>>>     File "<input>", line 1, in <module>
>>>     AttributeError: 'Product' object has no attribute 'amount'

1 Ответ

0 голосов
/ 22 марта 2019
screw.ingredients.all()[0]

Является продуктом, и если вы пытаетесь:

 screw.ingredients.all()[0].amount

, вы пытаетесь получить доступ к атрибуту amount Product, которого нет.Отсюда ошибка:

>>> AttributeError: 'Product' object has no attribute 'amount'.

Если вы хотите получить сумму, описывающую какое-то отношение, вы можете:

relation_data = RecipeComponent.objects.get(product=screw, ingredient=wood)
relation_data.amount  # The amount of wood for screw.

Или вы хотите узнать, сколько разных ингредиентов имеет винт:

RecipeComponent.objects.filter(product=screw).count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...