了解 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)
我想我可能想多了。我怀疑 UserProfile
和 Post
根本不需要关系,视图可以像这样用这两个 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 文档。
我需要一些帮助来解决 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
根本不需要关系,视图可以像这样用这两个 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 文档。