Фильтрация объектов, возвращаемых отношением (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
.