Похожие посты по имени тега - PullRequest
1 голос
/ 03 июля 2019

Я хочу показать похожие сообщения по имени тега. Однако я получил ошибку "get() returned more than one Tag -- it returned 2!"

def post_detail(request,slug):
        post=get_object_or_404(Post,slug=slug)
        comments=Comment.objects.filter(post=post,reply=None,statusc=2).order_by('-date')
        comment_count=len(Comment.objects.filter(post=post, statusc=2))
        tag=get_object_or_404(Tag,post=post)
        related_item=Post.objects.filter(tag__tag_name__icontains=tag.tag_name,status=2).order_by('-created_date').distinct()[:3]

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Согласно documentation, get() используется для получения 1 предмета.Если есть несколько элементов, здесь может быть несколько тегов, используемых в одном Post, это выдаст ошибку.

Итак, вы можете изменить это так:

 tags=Tag.objects.filter(post=post)
 related_item=Post.objects.filter(tag__in=tags,status=2).order_by('-created_date').distinct()[:3]
1 голос
/ 03 июля 2019

Вы можете просто запросить как:

def post_detail(request,slug):
    post=get_object_or_404(Post,slug=slug)
    comments=Comment.objects.filter(post=post,reply=None,statusc=2).order_by('-date')
    comment_count=len(comments)

    related_items = Post.objects.filter(
        <b>tag__post=post</b>
    ).order_by('-created_date').distinct()[:3]
    # ...

Или, если вы хотите исключить текущее сообщение:

def post_detail(request,slug):
    post=get_object_or_404(Post,slug=slug)
    comments=Comment.objects.filter(post=post,reply=None,statusc=2).order_by('-date')
    comment_count=len(comments)

    related_items = Post.objects<b>.exclude(pk=post.pk)</b>.filter(
        tag__post=pos
    ).order_by('-created_date').distinct()[:3]
    # ...

Также лучше выполнить len(..) для comments, поскольку это приведет к созданию запроса для получения комментариев, тогда как при использовании двух отдельных запросов попадет в базу данных дважды.

...