manyToManyField问题

时间:2010-06-07 09:49:32

标签: python django manytomanyfield

Hay伙计们,我正在写一个记录食谱的简单应用程序。

我正在研究我的模型,偶然发现了一个问题

我的碟子模型需要有很多成分。这没问题,因为我会做这样的事情

ingredients = models.ManyToManyfield(Ingredient)

没问题,我的菜现在可以有许多成分。

然而,问题是该成分需要有不同的数量。

I.E 4个鸡蛋,7汤匙糖

我的成分模型目前非常简单

class Ingredient(models.Model):
    name = models.TextField(blank=False)
    slug = models.SlugField(blank=True)

我将如何解决这个问题?我需要添加哪些字段,是否需要在ManyToManyfield上使用'through'属性来解决此问题?

1 个答案:

答案 0 :(得分:2)

我认为你通过“通过”表(http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

得到了正确的答案

<强>模型

class Recipe(models.Model):
    name = models.TextField(blank=False)
    ingredients = models.ManyToManyField(Ingredient, through='Components')

class Ingredient(models.Model):
    name = models.TextField(blank=False)
    slug = models.SlugField(blank=True)

class Components(models.Model):
    recipe = models.ForeignKey(Recipe)
    ingredient = models.ForeignKey(Ingredient)
    quantity = models.DecimalField()

您可以在成分水平上放置数量单位(克,千克,汤匙等),但我认为它在配料水平上更好(例如,您可以有1个配方,10克牛奶,另一个配1L。 ..所以相同成分的“不同”单位。

数据创建

By Dish你的意思是Recipe对吗?如果您查看上一个链接(http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany),它们会为您提供一个很好的示例(基于披头士乐队)。 基本上:

1.创建食谱:

cake=Recipe.objects.create(name="Simple Cake")

2.创建几种成分(如果它们之前的配方中尚不存在;)):

egg = Ingredient.objects.create(name="Egg")
milk = Ingredient.objects.create(name="milk")

3.创造关系:

cake_ing1 = Components.objects.create(recipe=cake, ingredient=egg,quantity = 2)  
cake_ing2 = Components.objects.create(recipe=cake, ingredient=milk,quantity = 200)

等等。另外,我现在非常确定单位应该进入组件级别,默认单位为“片段”(对于你的鸡蛋......),对于牛奶来说就像“mL”。

数据访问

为了获得配方的成分(成分),请执行以下操作:

cake = Recipe.objects.get(name = "Simple Cake")
components_cake = Components.objects.get(recipe = cake)