Django过滤器manytomanyfield排除与另一个模型相关的对象

时间:2019-05-09 11:34:20

标签: python django

我有2个模型,FileFileset

class File(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)


class Fileset(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    files = models.ManyToManyField(File, related_name='fileset_files')

我要过滤与其他File不相关的Fileset个对象

问题

考虑我有3个File对象:

  • 文件1
  • 文件2
  • File3

我有2个Fileset对象:

  • Fileset1(与File1相关)
  • Fileset2(与File1,File2和File3有关)

当我尝试查询时:

File.objects
.filter(fileset_files__fileset_name='Fileset2')  # all files from Fileset2
.exclude(fileset_files=Fileset.objects.get(fileset_name='Fileset1'))  # exclude the files that are in Fileset1   

这会像我想要的那样返回File2和File3。

当我拥有20个不同的文件集时,如何使它起作用?当我有多个文件集时,应该如何过滤其他文件集中的文件?

1 个答案:

答案 0 :(得分:1)

我通过使用annotateCount这样解决了这个问题:

from django.db.models import Count

File.objects
.annotate(fileset_count=Count('fileset_files__uuid'))
.filter(fileset_count=1)