Django 模型查询选择相关项并排除当前对象
Django model query selecting related items and excluding current object
我正在使用 Django 3.2
我有一个文章模型:
from taggit.managers import TaggitManager
class Article(models.Model):
# fields
tags = TaggitManager()
在我看来,我尝试 select 相关文章(使用标签相似度作为“距离度量”)。
这是returns相关文章在我的视图处理逻辑中的声明:
class ArticleDetailView(DetailView):
model = Article
pk_url_kwarg = "pk"
slug_url_kwarg = 'slug'
query_pk_and_slug = True
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
article_object = self.get_object()
article_tags_array = list(set([x for x in article_object.tags.names()]))
related_articles = self.model.objects.filter(is_published=True, tags__name__in=article_tags_array).exclude(id=article_object.id).prefetch_related().distinct()
context["related_articles"] = related_articles
return context
但是,尽管我 EXPLICITLY 调用了 exclude()
,但此语句无法 EXCLUDE 当前对象,在返回的 QuerySet 中在返回的 QuerySet 上。
为什么会这样?
如何解决这个问题,使当前对象不包含在返回的集合中?
您应该使用 .annotate(…)
来 count 匹配标签的数量:
from django.db.models import Count
article_object = self<strong>.object</strong>
article_tags_array = article_object.tags.all()
related_articles = self.model.objects<strong>.exclude(pk=article_object.pk)</strong>.filter(
is_published=True,
tags__in=article_tags_array
).annotate(
<strong>matching_tags=Count('tags')</strong>
)<strong>.order_by('-matching_tags')</strong>.prefetch_related()
我正在使用 Django 3.2
我有一个文章模型:
from taggit.managers import TaggitManager
class Article(models.Model):
# fields
tags = TaggitManager()
在我看来,我尝试 select 相关文章(使用标签相似度作为“距离度量”)。
这是returns相关文章在我的视图处理逻辑中的声明:
class ArticleDetailView(DetailView):
model = Article
pk_url_kwarg = "pk"
slug_url_kwarg = 'slug'
query_pk_and_slug = True
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
article_object = self.get_object()
article_tags_array = list(set([x for x in article_object.tags.names()]))
related_articles = self.model.objects.filter(is_published=True, tags__name__in=article_tags_array).exclude(id=article_object.id).prefetch_related().distinct()
context["related_articles"] = related_articles
return context
但是,尽管我 EXPLICITLY 调用了 exclude()
,但此语句无法 EXCLUDE 当前对象,在返回的 QuerySet 中在返回的 QuerySet 上。
为什么会这样?
如何解决这个问题,使当前对象不包含在返回的集合中?
您应该使用 .annotate(…)
来 count 匹配标签的数量:
from django.db.models import Count
article_object = self<strong>.object</strong>
article_tags_array = article_object.tags.all()
related_articles = self.model.objects<strong>.exclude(pk=article_object.pk)</strong>.filter(
is_published=True,
tags__in=article_tags_array
).annotate(
<strong>matching_tags=Count('tags')</strong>
)<strong>.order_by('-matching_tags')</strong>.prefetch_related()