Python Django-一对一关系,一端大部分为空,另一端不为空
我正在用Django和PostgreSQL编写一个简单的应用程序,用于管理一个家庭图书库,在这里我可以为借书的人提供许多借书人配置文件(Python Django-一对一关系,一端大部分为空,另一端不为空,python,django,postgresql,django-models,Python,Django,Postgresql,Django Models,我正在用Django和PostgreSQL编写一个简单的应用程序,用于管理一个家庭图书库,在这里我可以为借书的人提供许多借书人配置文件(借书人模型)。我有一些用户,他们可以自己借书,这样书就可以通过用户的借书人档案借来了 另一方面,管理员可以将书籍借给任何借款人,甚至是未注册用户 因此,我有一些MyUsers(顺便说一句,该字段引用Django的User)和许多借用者,我想在它们之间建立一对一的关系,但每个MyUser都必须引用一个唯一的借用者,但许多借款人s不会引用任何现有的MyUsers(他
借书人
模型)。我有一些用户,他们可以自己借书,这样书就可以通过用户的借书人档案借来了
另一方面,管理员可以将书籍借给任何借款人,甚至是未注册用户
因此,我有一些MyUser
s(顺便说一句,该字段引用Django的User
)和许多借用者
,我想在它们之间建立一对一的关系,但每个MyUser
都必须引用一个唯一的借用者
,但许多借款人
s不会引用任何现有的MyUser
s(他们只能引用一个或一个,或者换句话说,只能被一个或没有用户引用)
我的问题是:如何优化建模?使用models.OneToOneField
,models.ForeignKey
以及哪个模型应该引用哪个
我可能会有很多借款人,他们没有用户帐户
在用户
模型中,自然解决方案似乎是OneToOneField(借款人,null=False)
。但是,当根据借款人搜索用户时,我将不得不主要处理DoesNotExists
异常,并且偶尔我会得到一个正确的结果
我还可以设置ForeignKey(借用者,unique=True,null=False)
——然后我必须检查具有单个元素或空元素的集合
我可以通过两种方式制作ForeignKey
s:
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
,但我想知道在这种情况下哪种方法最有意义。程序和缺点是什么?还有其他更好的解决方案吗?我会坚持使用OneToOneField
;正如你所说,这是最自然的解决方案
您提到的唯一缺点是,forrower.user
可以引发DoesNotExist
异常。如果您不喜欢,您可以定义自己的方法(或属性)来返回其他内容(如None
)。比如:
class MyUser(models.Model):
borrower = models.OneToOneField(Borrower, null=False)
class Borrower(models.Model):
@property
def user(self):
try:
return self.myuser
except DoesNotExist:
return None
@user.setter
def user(self, user):
self.myuser = user