2011-11-22 40 views
0

我试图在Django中表示混合物。喜欢的东西:用Django模型表示混合物

Chemical #1 - 50% 
Chemical #2 - 30% 
Chemical #3 - 20% 

我想我会使用的包装所谓组成如下:

class Composition(models.Model): 
    """ Just a Wrapper """ 
    def save(...): 
     #Validate ingredients add up to 100% and such 


class Ingredient(models.Model): 
    composition = models.ForeignKey('Composition',related_name='ingredients') 
    name = models.CharField(max_length = 10) 
    percentage = models.IntegerField() 

我敢肯定有一个更好的方式来做到这一点。请记住,我是这样做的,所以我可以稍后在Django管理员中使用内联。你们推荐什么?非常感谢)

+1

你不需要一个表来跟踪混合物吗?如果是这样,这是一个基本的[ManyToMany](https://docs.djangoproject.com/en/dev/ref/models/fields/#manytomanyfield)关系 –

+0

@Dmitry通过跟踪混合物,你的意思是什么?我有另一个模型,这个模型与构图 – cookM

+0

有着onetoone的关系好吧,我会尝试使用ManyToMany关系。我必须看看我是否可以在管理员中以相同的方式表示他们。谢谢! – cookM

回答

3

在我看来,好像保留成分列表然后在创建作品时引用它们,而不是每次输入配料名称。你可以做它用多对多的关系,并通过一个表,像这样:

class Ingredient(models.Model): 
    name = models.CharField(max_length=10) 

class Composition(models.Model): 
    name = models.CharField(max_length=255) 
    ingredients = models.ManyToManyField(Ingredient, through='CompositionIngredient') 

    def save(...): 
     #Validate ingredients add up to 100% and such 

class CompositionIngredient(models.Model): 
    composition = models.ForeignKey(Composition) 
    ingredient = models.ForeignKey(Ingredient) 
    proportion = models.DecimalField() 

更多信息,请参见Django docs

编辑:这是documentation关于如何通过管理界面中的表处理。

+0

这很不错,不知道你能做到这一点。我会试一试,也是rtfm。谢谢! – cookM

+0

感谢您的补充文件,如果我可以的话会给你更多的分数:) – cookM