【问题标题】:django - relations between modelsdjango - 模型之间的关系
【发布时间】: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 的字段?

标签: django django-models relational-database


【解决方案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的区别

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 2013-04-05
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多