我有几个模型将ForeignKey返回到一个模型,该模型将一个ForeignKey返回给Django中的auth User。
models.py
class UserDetails(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name='userdetail_related')
details = models.CharField(max_length=100)
email = models.EmailField(unique=True)
class UserInformation(models.Model):
user = models.ForeignKey(
UserDetails,
related_name='userinfo_related')
info = models.CharField(max_length=100, default='this')
修改
在我的视图中,我想从self.request.user访问UserInformation模型。
我可以通过以下方式在我的视图中访问UserDetails:
details = self.request.user.userdetail_related.filter(
user=self.request.user).first()
但我无法通过以下方式访问UserInformation:
info = self.request.user.userdetail_related.filter(
user=self.request.user).first().userinfo_related.filter(
info='this').first()
我能让它发挥作用的唯一方法是:
details = self.request.user.userdetail_related.filter(
user=self.request.user).first()
info = details.userinfo_related.filter(
info='this').first()
但是这肯定会在数据库中击中两次,这是我不想要的。
有没有人有更好的方法使用会话用户'通过'从UserInformation获取信息?的UserDetails?
答案 0 :(得分:5)
您可以使用以下内容:
user_info = UserInformation.objects.filter(user__user=self.request.user).first()
此外,当您访问UserDetails
时,您并不真正需要过滤器,因为您尝试从user
本身访问相关对象。所以下面也可以。
details = self.request.user.userdetail_related.first()
作为附注,我认为您需要OneToOneField
,因为一个user
应该只有一个UserDetails
。
答案 1 :(得分:0)
正如@AKS建议的那样,您应该使用OneToOneField
将模型与User
相关联。你可以这样做:
class UserDetails(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
related_name='userdetail_related')
details = models.CharField(max_length=100)
class UserInformation(models.Model):
user = models.OneToOneField(
UserDetails,
related_name='userinfo_related')
info = models.CharField(max_length=100, default='this')
然后您可以像这样访问UserInformation
和UserDetails
:
details = self.request.user.userdetail_related.details
info = self.request.user.userinfo_related.info
答案 2 :(得分:0)
要添加其他答案,请注意有关布局的一些评论。
对于模型名称,最好始终使用单数(UserDetails - > UserDetail),而不是复数。然后,对于ForeignKey的相关名称,使用复数(因为反向查找可能会找到多个具有向后关系的项目。)
class UserDetail(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='details')
details = models.CharField(max_length=100)
class UserInformation(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='info')
info = models.CharField(max_length=100, default='this')
使视图中的访问更加简单
request.user.infos.all().first()
request.user.details.filter(info__startswith="something")
另外,如果可行的话,将两者都添加到User
对象上,因为"flat is better than nested" 。
如果每个User
只有一个UserDetail
和一个UserInformation
,则最好使用OneToOneField
。