django - 模型之间的关系
Posted
技术标签:
【中文标题】django - 模型之间的关系【英文标题】:django - relations between models 【发布时间】:2012-09-12 18:04:48 【问题描述】:我有两个模型,即 Post 和 Profile。我保留博客数据,这些数据是 Post 中的标题、正文、所有者、slug 等。并保留用户个人资料设置,即个人资料中的口号、电子邮件、网站等
在我的 index.html 页面中,我在同一页面中显示用户个人资料信息和发布列表。所以 ; 我需要将这两个模型相互连接。当有人访问 127.0.0.1/blog/username(无论是否登录)时,属于名为“username”的用户的所有数据都必须存在。
这是我的models.py:
class Profile(models.Model):
slogan = models.TextField(blank=True)
twitter = models.CharField(max_length = 100,blank=True)
web_site = models.CharField(max_length=100,blank=True)
email = models.CharField(max_length = 100,blank=True)
def __unicode__(self):
return self.slogan
class Post(models.Model):
owner = models.ForeignKey(User)
title = models.CharField(max_length = 100)
body = models.TextField()
bodyPreview = models.TextField() #preview için body alanı
titlePreview = models.CharField(max_length=100) # preview için title alanı
slug = AutoSlugField(populate_from='title' ,unique=True)
posted = models.DateField(auto_now_add=True)
isdraft = models.BooleanField(default=False)
def __unicode__(self):
return self.title
@permalink
def get_absolute_url(self):
return ('view_blog_post',None,'postslug':self.slug)
和我的索引视图:
def index(request,username):
post_list = Post.objects.filter(owner__username=username).filter(isdraft=False).order_by("-posted")
p_index = Paginator(post_list,3) #anasayfa için pagination.[her sayfada 3 post]
page = request.GET.get('page')
try:
indexPag = p_index.page(page)
except PageNotAnInteger:
indexPag = p_index.page(1)
except EmptyPage:
indexPag = p_index.page(p_index.num_pages)
## i need to get user's profile datas here. ??
return render_to_response('index.html',
'post_list':post_list,'p_index':indexPag,'profile':query,
context_instance = RequestContext(request))
【问题讨论】:
从Profile
到User
的FK在哪里?
在 FK 之后;我应该如何从视图中访问 Profile Model 的字段?
【参考方案1】:
我认为您应该更改 Profile 模型并将 OneToOne 关系添加到 User 模型(有关更多信息,请参阅here):
class Profile(models.Model):
user = models.OneToOneField(User)
...
class Posts(models.Model):
author = models.ForeignKey(User)
...
然后在你的观点中你可以这样做:
user = get_object_or_404(User, username=username)
post_list = Post.objects.filter(author=user).filter(isdraft=False).order_by("-posted")
return render_to_response('index.html',
'post_list': post_list, 'user': user, ..., ...)
然后在您的模板中,您可以访问用户的个人资料。更多 here
例如user.get_profile.slogan
【讨论】:
【参考方案2】:在你看来:
def index(request, username):
user = User.objects.get(username=username)
return render(request, 'index.html', 'user':user)
在您的模板中:
user.post_set
您将收到当前用户的帖子列表。
【讨论】:
获取帖子列表没有问题。我需要获取属于用户的个人资料设置。【参考方案3】:实现这一目标的最自然的方法是添加您的 Profile 模型和 django 的 User 之间的 OneToOne 关系强>模型。
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User)
# More fields
class Article(models.Model):
author = models.ForeignKey(User)
# More fields
这样,您可以通过用户对象访问配置文件数据。会是这样的:
user = User.objecets.get(username=username)
profile = user.profile
关于这个的更多信息,你可以阅读 django 模型字段文档here 你也可以看到this cool answer关于unique=True的ForeignKey和OneToOneField的区别
希望对你有帮助
【讨论】:
以上是关于django - 模型之间的关系的主要内容,如果未能解决你的问题,请参考以下文章
在创建两个模型后,在两个模型之间创建关系。 (Python,Django,SQLite)