2010-09-16 100 views
3

在Django中,我有以下型号:数据库设计:责令很多一对多的关系

class Pink(models.Model): 
    ... 

class White(models.Model): 
    ... 
    pinks = models.ManyToManyField(Pink) 
    ... 



在某个时候,我需要定义里面White Pinks排序(为了有White1.pinks: P1, P2, P3而不是随机White1.pinks: P2, P3, P1, 所以我创建

class PinkInWhite(models.Model): 
    pink = models.ForeignKey(Pink) 
    white = models.ForeignKey(White) 
    position = models.PositiveIntegerField("pink's position inside this white") 

    class Meta: 
     ordering = ['white','position'] 



问题1:这是更好的解决方案吗?

问题2:这显然是多余的:我还有一个pinks场在我White模式,因为我需要它在不需要排序的其他情形。我可以保留它,还是更好地删除它,并始终使用PinkInWhite关系模型?




(型号名称是虚构的。为了简化,我没有使用模型的实名制的问题,和谈论X先生和Y先生也不会帮可读性...)

回答

1

这取决于您的预期用途的定义如何。

如果您只是在寻找一组白色的有序粉红色,您可以将所有东西都放在一张桌子上,并避免连接表PinkInWhite

但是,如果你以后可能想要除了红色的色调之外还有其他的色彩,那么如你所做的那样将粉红色直接绑在白色上太具有限制性。只要将白人留作白人,并创建一个连接粉红色和可疑白人的联结表(与排序)。然后你可以灵活地制作蓝调,黄色等等的色调。

但你的问题的简短答案,你有什么可用。

+1

如果您确实需要使用连接表/连接表,则在Django中实现的方式称为使用直通模式 - 请参阅http://docs.djangoproject.com/en/dev/topics/db/models/ #额外的字段上,多到多对多关系 – 2010-09-16 18:33:30