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

Understanding Django's ORM (Database Design with ForeignKey and QuerySets)

我需要一些帮助来解决 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 根本不需要关系,视图可以像这样用这两个 QuerySet 呈现单独的数据吗? posts=Post.objects.filter(user=request.user)user_profile = UserProfile.objects.filter(user=request.user)

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 and following relationships backward 的 django 文档。