Обратный поиск значения ForeignKey (дочерний к родительскому) - PullRequest
0 голосов
/ 27 мая 2019

Мне нужен доступ к значению в обратном порядке, используя ForeignKey. Я хочу перейти от дочерней модели 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)

Шаблон

<div class="row">
<div style="padding: 0px;" class="col l12">
    {% for category in categories %}

<div class="col l3">
    <div style="background-color: white; box-shadow: 0 1px 15px 1px rgba(62,57,107,.07); border-radius: .6rem;" class="card ">
        <div class="card-body text-center">
            <div class="mb-4 pb-3"><i class="ti-briefcase text-muted font-40"></i></div>

            <h5 class="mb-3"> <a href="{% url 'blog_category' category %}">{{ category.name }}</a></h5>

            <div><a class="d-inline-flex align-items-center text-danger" ><a href="{% url 'blog_detail' category.name category.posts.slug category.posts.pk %}">{{ category.posts.title }}</a><i class="material-icons">
                keyboard_arrow_right
                </i></a></div>

        </div>
    </div>
</div>
{% endfor %}

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Поскольку у одного Category может быть несколько постов, вам нужно их перебрать:

category.posts.all()

В шаблоне:

{% for category in categories %}
    {{ category.name }}
    { % for post in category.posts.all %}
        {{ post.title }}
    {% endfor %}
{% endfor%}
1 голос
/ 27 мая 2019

Вам нужно перебрать сообщения в каждой категории

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

Добавлена ​​аннотация для получения количества сообщений для каждой категории

{% category.post_count %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...