2016-06-30 78 views
0

我想在Django中使用建立一个SQL数据库。我从抽象的角度理解模型,但我不知道如何构建数据库以了解是否正确地关联这些对象。我想保留这个摘要,以便我可以自己实现代码。复杂的Django模型关系

说我有三种类型的对象:ABCA可容纳一个或多个B。 A B可以以任意组合存储多个BC,但它必须至少包含一个(BC)。 A C仅保存一些数据,并且是一个简单的构造。

目前我有:

from django.db import models 

class A(models.Model): 
    # A attributes 

class B(models.Model): 
    a = models.ForeignKey(A, on_delete=models.CASCADE) 
    # B attributes 

class C(models.Model): 
    b = models.ForeignKey(B, on_delete=models.CASCADE) 
    # C attributes 

我知道,这只是允许之间CBBA一个多到一的关系,但我不知道如何让一个B指到另一个B

我也希望能够很容易地写出一个表格,其中您首先需要至少一个BA,并且您可以随意添加或删除B s。这可能吗?

我认为可能只是设置这些数据的一种更好的方法,但我没有看到它,因为我对数据库组织非常陌生。


如果有帮助,我正在设计一个表格,以便于编写游泳训练。 A是一个锻炼,它有一个标题和一个作者。每个B是一组。套件由诸如“2x50码自由泳”或“2点上的8x100 IM” - C s组成。但是有时候一个集合有一个子集,就像一个循环。

回答

1

我强烈建议检查出的模型Django文档可以在这里找到:Django Models

此外,做一个对称的多对多的关系,使用:

class B(models.Model): 
    bs = models.ManyToManyField("self") 

此外,我建议做A和B之间的关系是多对多关系而不是外键。这将允许您将B分配给多个A,同时仍允许1 A拥有多个B。 B和C可能会采用相同的逻辑。

要回答您提出的有关使B成为A所需的问题,我不认为这是可能的。看看这个问题的更多信息:Django 1.7: how to make ManyToManyField required?

+0

啊,好的。这些都是很好的建议。我会检查一下。然而......我很好奇A和B的关系是多对多的。如果Bs由他们的主键(一个数字)来标识,我什么时候会看到多个As是指同一个B? –

+0

如果您具有可用于2种不同锻炼的相同组合,则只需创建1个数据库条目。多对多的关系允许这样做,而一个外键会要求你在每次你想把它添加到一个新的锻炼中时创建一个新的相同的条目 – Written

+0

嗯好吧,但数据库如何确定它们是一样?作为一个用户,你不会选择预先存在的集合(尽管...也许这可能是一个功能,但它并不打算)。我想象的方式是:有人会填写一张表格来编写锻炼,然后锻炼将张贴给其他人阅读。锻炼不可能很容易被编辑或重复使用。 (我不是想说我不喜欢你的建议,我只是不知道我们的想法是否排队!) –