Фильтрация объектов, возвращаемых отношением (set.all) в Django

Я пытаюсь решить проблему фильтрации объектов, возвращаемых set.all. Я хотел бы отображать объекты, которые строго назначены для текущего вошедшего пользователя.

Ниже приведен псевдокод, иллюстрирующий ситуацию.

class Tags(models.Model)

class Comment(models.Model):
creator = models.ForeignKey(... related_name='example')
tag = models.ManyToManyField(Tags)

В представлении общей детализации "тег"

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['author_objects'] = Comment.objects.filter(creator=self.request.user)
    return context

В шаблоне тега detail я использую set.all для возврата объектов обратного вызова. Однако это все назначенные объекты, и я хотел бы отфильтровать их.

{% for comment in tags.comment_set.all %}
     <a href="{% url 'comment-detail' comment.id %}">{{ comment.title }}</a>
{% endfor %}

Я пробовал много решений для отображения комментариев, созданных пользователем (даже с "авторскими объектами", вложенными циклами), но я получаю все назначенные объекты или ничего. Я подозреваю, что контекст не работает, но речь шла о визуализации ситуации наилучшим образом.

Вы можете указать QuerySet с выражением Prefetch(…) [Django-doc] для получения отфильтрованного набора комментариев.

Вы делаете это, переопределяя get_queryset(…) [Django-doc] с:

from django.db.models import Prefetch

class MyView(SomeView):
    model = Tags
    
    def get_queryset(self):
        return super().get_queryset().prefetch_related(
            Prefetch(
                'comment_set',
                queryset=Comment.objects.filter(creator=self.request.user)
            )
        )

Нет необходимости изменять get_context_data. Указав объект Prefetch, comment_set будет содержать только комментарии с self.request.user как creator.

Вернуться на верх