获取与Django中另一个对象具有最多标记的对象

时间:2015-10-20 09:45:54

标签: django django-orm

假设我有一个与Tag模型有多对多关系的Image模型。

给定一个图像,找到所有图像的最佳方法是什么,所述图像与所述图像共有多于x个标签,并且按照共同的标签数量排序?

例如,如果我的图片带有标签sand, beach, house, water, sea 我想找到让我们说出所有至少有2个这些标签的图像,然后根据它们有多少来排序。 (基本上是使用相同数量的标签来定义相似性的类似图像函数的实现)

如果可能的话,在这里寻找一个优化的解决方案,使用Django的orm

1 个答案:

答案 0 :(得分:2)

这应该做的工作:

img = Image.objects.first()

Image.objects.filter(tags__in=img.tags.all()).\
  annotate(num_common_tags=Count('pk')).order_by('-num_common_tags')

# To filter out Images with < 2 common tags

Image.objects.filter(tags__in=img.tags.all()).\
  annotate(num_common_tags=Count('pk')).filter(num_common_tags__gt=2).\
  order_by('-num_common_tags')