我需要一些帮助来绕着Django 1.8&#ORM。我对如何正确地在数据库中实现关系感到困惑。
我希望User
个对象拥有一个UserProfile
。我还需要User
才能制作多个Posts
。
然后我希望UserProfile
能够访问用户所做的所有帖子,以便我可以在userprofile
视图中显示这些帖子。我应该将Post
FK提供给UserProfile
还是反过来或者根本不是这样做的?
如果这是正确的方法,我甚至会如何查询用户的所有帖子? 到目前为止,这是我的模型的代码:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
biography = models.TextField(max_length=500, blank=True)
likes = models.IntegerField(default=0, blank=True)
dislikes = models.IntegerField(default=0, blank=True)
slug = models.SlugField(max_length=50)
def __unicode__(self):
return unicode(self.user.username)
class Post(models.Model):
user = models.ForeignKey(User,null=True)
user_profile = models.ForeignKey(UserProfile, null=True)
title = models.CharField(max_length=50, blank=False)
body = models.TextField(max_length=500, blank=False)
description = models.CharField(max_length=100, blank=True)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
def __unicode__(self):
return unicode(self.title)
我想我可能会过度思考这一切。我怀疑UserProfile
和Post
根本不需要关系,而视图只能使用这两个QuerySets呈现单独的数据?
posts=Post.objects.filter(user=request.user)
和
user_profile = UserProfile.objects.filter(user=request.user)
答案 0 :(得分:1)
在Post模型上不需要user_profile FK。 如果您想要访问用户创建的所有帖子以便在UserProfile上显示它们,您可以在给定user_profile实例的情况下使用此查询:
user_posts = user_profile.user.post_set.all()
user_profile
具有用户属性,因为OneToOne字段具有post_set
属性,该字段已链接到您的用户,并为您提供该用户创建的所有帖子。此外,post_set也是一个查询集,这意味着你也可以对它进行过滤:
user_profile.user.post_set.filter(title__icontains='Django')
上面的代码会为您提供标题中包含“django”的给定user_profile
的所有帖子。
如需进一步参考,请参阅related objects和following relationships backward上的django文档。