Django ORM:通过模型进行多对多自参考

时间:2019-03-22 03:55:25

标签: django django-models orm

我有一个多对多的自引用关系,其中包括一个直通模型。产品由其他产品组成,包括一定数量(例如,螺钉由铁棒制成)。我制作了贯通模型,尽管似乎无法访问贯通模型中的“金额”字段:

型号代码:

<div id='calendar'></div>

<script>
 $('#calendar').fullCalendar({
         events: [
        {
            title  : 'event1',
            start  : '2019-03-20'
        },
        {
            title  : 'event2',
            start  : '2019-03-15',
            end    : '2019-03-18'
        }
    ],
 })
</script>

我尝试了许多其他查询,但是如您所见,它们似乎失败了。我知道我想念一些东西,但是我无法将手指放在上面。

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

2 个答案:

答案 0 :(得分:0)

screw.ingredients.all()[0]

是产品,如果您尝试:

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

您正在尝试访问amount的{​​{1}}属性,该属性没有此属性。因此出现错误:

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.

答案 1 :(得分:0)

您可以在 Product 类中创建一个方法来返回给定成分的数量:

class Product(models.Model):
    ...
    ...
    def get_amount_of_ingredient(self, ingredient):
        try:
            return RecipeComponent.objects.get(item=self, ingredient=ingredient).amount
        except RecipeComponent.DoesNotExist:
            return 0

然后从 screw 对象调用它:

screw.get_amount_of_ingredient("iron_rod")