反向查询ForeignKey(子级到父级)的值

时间:2019-05-27 19:24:36

标签: python django

我需要使用ForeignKey以相反的方式访问值。我想从子模型setTimeout(function () { $.getJSON('test.json').then(function (data) { for (let i = 0; i < data.data.length; i++) { $('body').append(` <p>`+data.data[i].name+`</p> <p>`+data.data[i].address+`</p> <p>`+data.data[i].occupation+`</p> `) } if (Notification.permission !== 'denied' || Notification.permission === "default") { Notification.requestPermission(function (permission) { if (permission === "granted") { /* Insert function that checks for a change in the JSON, and sends a notification if true */ } }); }); }, 5000); 转到父模型Category并将值Post抓到我的模板中

我已经尝试过title,但对我来说却没有任何成功。

主要目的是为每个类别创建一个category.posts.title,并在下面列出具有该类别的博客文章。

型号:

<div>

查看:

class Category(models.Model):
    name = models.CharField(max_length=30)

class Post(models.Model):
    slug = models.SlugField(max_length = 250, null = True, blank = True)
    title = models.CharField(max_length = 250, default="Blog Post")
    body = models.TextField()
    created_on = models.DateTimeField(null=True)
    last_modified = models.DateTimeField(null=True)
    categories = models.ForeignKey('Category', related_name='posts', default="2", unique=False, on_delete=models.CASCADE)

模板

def blog_index(request):
    posts = Post.objects.all().order_by('-created_on')
    categories = Category.objects.all()
    context = {
        "posts": posts,
        "categories": categories,
    }
    return render(request, "blog_index.html", context)

2 个答案:

答案 0 :(得分:2)

一个Category可能有多个帖子,您需要对其进行迭代:

category.posts.all()

在模板中:

{% for category in categories %}
    {{ category.name }}
    { % for post in category.posts.all %}
        {{ post.title }}
    {% endfor %}
{% endfor%}

答案 1 :(得分:1)

您需要遍历每个类别中的帖子

{% for post in category.posts.all %}
    <a href="{% url 'blog_detail' category.name post.slug post.pk %}">{{ post.title }}</a>
{% endfor %}

您还应该在类别查询集上使用prefetch_related,以减少访问category.posts.all时进行的数据库查询数量,因为您不再需要帖子查询集。

def blog_index(request):
    categories = Category.objects.annotate(
        post_count=Count('posts')
    ).prefetch_related('posts')
    context = {
        "categories": categories,
    }
    return render(request, "blog_index.html", context)

添加了annotation,以获取每个类别的帖子数

{% category.post_count %}