【发布时间】:2014-11-19 21:31:26
【问题描述】:
我正在使用 Django 和 PostgreSQL 编写简单的应用程序来管理一个家庭图书库,在那里我可以为借书的人提供许多借书人资料(Borrower 模型)。而且我有用户,他们可以自己借书,这样图书就会被用户的借书人资料借阅。
另一方面,管理员可以将书籍借给任何借阅者,甚至可以借给未注册的用户。
所以我有几个MyUsers(顺便说一句,那个字段引用了Django的User)和许多Borrowers,我想在它们之间创建一对一的关系,但是每个@ 987654325@ 已经 引用了一个唯一的Borrower,但许多Borrowers 不会引用任何现有的MyUsers(它们只能引用一个或没有,或者换句话说,被引用只有一个用户或没有用户)。
我的问题是:如何进行最佳建模?使用models.OneToOneField、models.ForeignKey,哪个模型应该引用哪个?
我可能会有很多没有用户帐户的借款人。
User 模型中的自然解决方案似乎是 OneToOneField(Borrower, null=False)。但是当基于借款人搜索用户时,我将不得不主要处理DoesNotExists 异常,并且只有偶尔我会得到正确的结果。
我也可以创建ForeignKey(Borrower, unique=True, null=False) - 然后我将不得不检查具有单个元素或空的集合。
我可以同时使用ForeignKeys:
class Borrower(models.Model):
# ...
user = models.ForeignKey(MyUser, unique=True, null=True)
class MyUser(models.Model):
# ...
borrower = models.ForeignKey(Borrower, unique=True, null=False)
这隐含地定义了关系,我可以轻松地进行双向搜索,但它也在数据库表中产生了一个额外的冗余字段。
我现在可能只会坚持使用OneToOneField,但我想知道在这种情况下哪种方法最有意义。有什么好处和坏处?还有其他更好的解决方案吗?
【问题讨论】:
标签: python django postgresql django-models