2017-06-06 76 views
1

我正在开发一个Django项目,其中包括两个有关系的模型。在Django模型中正确定义这种数据关系

第一个模型通常描述了一道菜。它有一个名字和其他一些基本信息,比如:

dish(models.Model): 
    name = models.CharField(max_length=100) 
    short_desc = models.CharField(max_lenght=255) 
    vegetarian = models.BooleanField(default=False) 
    vegan = models.BooleanField(default=False) 

第二种模式是关系到菜,我想在一到一个关系的形式。该模型包含准备和成分。这些数据可能会随着时间而改变(例如调整准备文本)。这个文本的旧版本仍然存储,但没有连接到盘子。所以这道菜得到了一个新的领域,它指向当前的准备文本。

preparation = models.???(???) 

所以,每当准备说明发生变化的新条目的编写创建和菜的参考的准备更新。

本身看起来像这样的准备:

preparation(models.Model): 
    prep_test = models.TextField() 
    ingredients = models.TextField() 
    last_update = models.DateTimeField() 

如前所述,我认为,一个对一个的关系将是dishpreparation之间合理。

我对一对一关系的假设是否正确?如果是,我该如何正确定义它?

回答

2

如果您有多种菜肴准备工作,则根据定义您没有一对一的关系。

定义这个的方法是从准备到盘的ForeignKey。 (请注意,Python的风格是上课的时间与一个大写字母。)

class Preparation(models.Model): 
    ... 
    dish = models.ForeignKey('Dish') 

现在你可以做my_dish.preparation_set.latest('last_update')获得了一盘最新的准备。如果您将内部Meta类添加到“准备”并定义get_latest_by = 'last_update'),则可以省略参数latest()呼叫。

+0

这是有道理的,谢谢你的帮助 – SaAtomic

2

确保关系是正确的,否则你在你的模型中重复元组,这不是很好的做法,使你的数据库非常沉重。从我的角度看关系。

class dish(models.Model): 
    name = models.CharField(max_length=100) 
    short_desc = models.CharField(max_lenght=255) 
    vegetarian = models.BooleanField(default=False) 
    vegan = models.BooleanField(default=False) 

class Ingredients(models.Model): 
    name = models.CharField(max_length=100) 
    dish = models.ForeignKey(dish) 

class preparation(models.Model): 
    prep_test = models.TextField() 
    last_update = models.DateTimeField() 
    dish = models.OneToOneField(dish) 
1

为什么你不做菜的准备与关系。

我盘有多个准备,但只有一个活动。您可以将最新的关于last_update = models.DateTimeField()

基地的模式将是这样的:

class preparation(models.Model): 
    dish = models.ForeignKey(dish) 
    ...