理解Django的ORM(使用ForeignKey和QuerySets进行数据库设计)

时间:2015-11-08 20:02:43

标签: django django-orm

我需要一些帮助来绕着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)

我想我可能会过度思考这一切。我怀疑UserProfilePost根本不需要关系,而视图只能使用这两个QuerySets呈现单独的数据?  posts=Post.objects.filter(user=request.user)user_profile = UserProfile.objects.filter(user=request.user)

1 个答案:

答案 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 objectsfollowing relationships backward上的django文档。