Django 通过多对多字段交集过滤对象
Django filter objects by Many-To-Many field intersection
您好,
有好心人可以给我一些建议,告诉我如何通过将多对多字段与给定对象的多对多字段相交来获取有序对象的查询集吗?
例如我有:
class 视频(models.Model):
标签 = models.ManyToManyField(标签,空白=真)
...
class 标签(models.Model):
姓名 = models.CharField(max_length=64)
...
我 select 一个视频对象,并希望将具有最相似标签的前十个对象设置为显示相关视频。
提前致谢!
我做了一个简单的例子,应该可以的
tag1 = Tag.objects.create(name="test video") #create a tag
video1 = Video.objects.create() #create a video
video1.tags.add(tag1) #add tag to video
video_query = Video.objects.filter(tags__name="test video")
print("query",video_query)
现在在这个例子中它只有 1 个标签,但是如果你有 100 个标签,请在 video_query = Video.objects.filter(tags__name="test video")[: 11]
这将为您提供完全匹配。
如果您使用:
video_query = Video.objects.filter(tags__in=example_video.tags.all())
您将得到一个包含至少有 1 个匹配标签的所有视频的查询,如果一个视频有 2 个匹配标签,它将在查询中出现 2 次。您可以获取查询中多次出现的视频。您需要从查询
中排除 example_video
您好,
有好心人可以给我一些建议,告诉我如何通过将多对多字段与给定对象的多对多字段相交来获取有序对象的查询集吗?
例如我有:
class 视频(models.Model):
标签 = models.ManyToManyField(标签,空白=真)
...
class 标签(models.Model):姓名 = models.CharField(max_length=64)
...
我 select 一个视频对象,并希望将具有最相似标签的前十个对象设置为显示相关视频。
提前致谢!
我做了一个简单的例子,应该可以的
tag1 = Tag.objects.create(name="test video") #create a tag
video1 = Video.objects.create() #create a video
video1.tags.add(tag1) #add tag to video
video_query = Video.objects.filter(tags__name="test video")
print("query",video_query)
现在在这个例子中它只有 1 个标签,但是如果你有 100 个标签,请在 video_query = Video.objects.filter(tags__name="test video")[: 11]
这将为您提供完全匹配。
如果您使用:
video_query = Video.objects.filter(tags__in=example_video.tags.all())
您将得到一个包含至少有 1 个匹配标签的所有视频的查询,如果一个视频有 2 个匹配标签,它将在查询中出现 2 次。您可以获取查询中多次出现的视频。您需要从查询
中排除 example_video