Django中如何查询未关联Batch的Record多对多模型实例?
Django多对多关系中查询未关联的实例
给定两个通过多对多关联的Django模型:
from django.db import models class Record(models.Model): name = models.CharField(max_length=64) class Batch(models.Model): records = models.ManyToManyField(Record)
需要查询所有未与任何Batch关联的Record实例,但尝试以下写法均失败:
Record.objects.filter(batch=[]) # TypeError: Field 'id' expected a number but got []. Record.objects.filter(batch__count=0) Record.objects.filter(batch__len=0) # FieldError: Related Field got invalid lookup: count
这些写法的问题在于:
- 反向多对多的默认关联字段是
batch_set而非batch,且Django不支持直接用空列表作为过滤条件 __count或__len不是Django ORM支持的查询lookup,聚合类查询需要先通过annotate生成统计字段
正确实现方式
方法1:利用反向关联的isnull查询(最简洁高效)
未关联任何Batch的Record,其反向关联的batch_set为空,直接用isnull=True过滤:
Record.objects.filter(batch_set__isnull=True)
方法2:通过聚合统计过滤
先给每个Record标注关联的Batch数量,再筛选数量为0的实例:
from django.db.models import Count Record.objects.annotate(num_batches=Count('batch_set')).filter(num_batches=0)
方法3:排除已关联的实例
先获取所有已被Batch关联的Record ID,再排除这些ID对应的实例:
Record.objects.exclude(id__in=Batch.objects.values_list('records__id', flat=True))
内容的提问来源于stack exchange,提问作者Matthew Scouten
相关产品推荐
相关产品推荐

