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))

【问题讨论】:

ProfileUser的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 - 模型之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

Django中存储在不同数据库中的模型之间可能存在关系吗?

django之模型类迁移和数据库表之间的关系

在创建两个模型后,在两个模型之间创建关系。 (Python,Django,SQLite)

任何人都可以仅使用 ForeignKey 在两个 django 模型之间建立多对多关系吗?

如何使用 django 表单/模型来表示字段之间的选择?

Django - 使用表单集在不通过表的情况下建立 2 个模型之间的多对多关系