Django listview有多个模型和过滤器

时间:2015-10-29 06:51:31

标签: python django django-models django-templates django-views

Django新手在这里......

我有三种模型,我目前正在努力解决这个模型,并获得了理想的解决方案。但是,解决方案当然不是有效的,也不是良好的做法。我只是不知道足以实现我想要的东西。

以下是模型......

基础/ models.py

class Tag(models.Model):
    slug = models.SlugField(max_length=200, unique=True)

    def __unicode__(self):
        return self.slug
    def get_absolute_url(self):
        return reverse("tag_index", kwargs={"slug": self.slug})


class post(models.Model):
    title = models.CharField(max_length = 180)
    // a bunch of other fields here
    tags = models.ManyToManyField(Tag)

    def get_absolute_url(self):
        return reverse("post_detail", kwargs={"slug": self.slug})

    def __unicode__(self):
        return self.title

    class Meta:
        verbose_name = "Blog Post"
        verbose_name_plural = "Blog Posts"
        ordering = ["-created"]

项目/ models.py

class project(models.Model):
    projectTitle = models.CharField(max_length=150, null=False)
    projectTag = models.OneToOneField(Tag, primary_key=True)
    description = MarkdownField()

    def __unicode__(self):              # __unicode__ on Python 2
        return self.projectTitle

    class Meta:
        verbose_name = "Project"
        verbose_name_plural = "Projects"

现在......我想要做的是创建一个足够的视图,该视图仅将标记有项目标签的帖子传递给我的模板,而不是当前所有的帖子。

项目/ views.py

class projectFeed(generic.ListView):
    queryset = project.objects.all()
    template_name = "projects.html"
    paginate_by = 5

    def get_context_data(self, **kwargs):
        context = super(projectFeed, self).get_context_data(**kwargs)
        # slug = self.kwargs['projectTag']
        # tag = Tag.objects.get(slug=slug)
        context['posts'] = post.objects.all()#filter(tags=tag)
        return context

正如您所看到的,我尝试了一些用于创建视图的内容,以显示具有特定标记的所有帖子,但我无法在此处使用。

项目/模板/ projects.html

{% for project in project_list %}

<div class='postContent'>
    <!-- project stuff here -->

    {% for post in posts %}
        {% if project.projectTag in post.tags.all %}
            <p><a href="{% url 'post_detail' slug=post.slug %}"> {{ post.title }} </a></p>
        {% endif %}
    {% endfor %}


</div> 

{% endfor %}

理想情况下......我想传递一个嵌套的排序列表,其中project中的每个project_list都有一个相关的帖子列表,我可以在内部for循环中迭代而无需检查标签。也就是说,我想在视图方法/类或其他更有效的地方过滤和排列数据。

1 个答案:

答案 0 :(得分:1)

您可以使用下一个相关经理获取相关帖子的列表: posts = project.projectTag.post_set.all() 为什么不尝试在模板中使用它

{% for project in project_list %}
<!-- project stuff hete -->
   {% for post in project.projectTag.post_set.all %}
   <!-- post stuff goes here -->
   {% endfor %}
{% endfor %}

但是为了减少sql查询的数量,你必须覆盖ListFilter的get_queryset方法:

def get_queryset(self):
    return super(projectFeed, self).get_queryset()
                          .select_related('projecttag')
                          .prefetch_related('projecttag__post_set')