Django查询:筛选T恤颜色与喜爱颜色完全一致的Child实例
如何查询T恤颜色恰好等于喜爱颜色的孩子?
首先是定义的模型(补充了CharField必需的max_length参数):
class Color(models.Model): name = models.CharField(max_length=100) class Child(models.Model): fave_colors = models.ManyToManyField(Color, related_name="kid_fave") tshirt_colors = models.ManyToManyField(Color, related_name="kid_tshirt")
要筛选出T恤颜色集合与喜爱颜色集合完全一致的孩子,核心是确保两个多对多集合互为子集,以下是两种可行的实现方式:
方式一:通过排除不符合条件的记录
直接排除存在「T恤颜色不在喜爱颜色中」或「喜爱颜色不在T恤颜色中」的孩子,剩下的就是符合要求的:
from django.db.models import Q, F lucky_kids = Child.objects.exclude( # 排除有T恤颜色不在喜爱颜色里的孩子 Q(tshirt_colors__isnull=False) & Q(tshirt_colors__notin=F('fave_colors')) ).exclude( # 排除有喜爱颜色不在T恤颜色里的孩子 Q(fave_colors__isnull=False) & Q(fave_colors__notin=F('tshirt_colors')) )
这种方式能自然处理空集合的情况(比如孩子既没有喜爱颜色也没有T恤颜色,会被包含在内),如果需要排除空集合的情况,可以额外添加filter(fave_colors__isnull=False)。
方式二:结合计数与子集判断
如果两个集合的元素数量相等,且其中一个是另一个的子集,那么这两个集合必然完全相同。通过annotate统计两个集合的元素数量,再结合子集判断实现:
from django.db.models import Count, F lucky_kids = Child.objects.annotate( fave_count=Count('fave_colors'), tshirt_count=Count('tshirt_colors') ).filter( fave_count=F('tshirt_count'), tshirt_colors__in=F('fave_colors') )
内容的提问来源于stack exchange,提问作者axoplasm
相关产品推荐
相关产品推荐

