我有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
文件3


我有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个不同的文件集时,如何进行这项工作?当我有多个文件集时,应如何过滤其他文件集中的文件?

最佳答案

我通过使用annotateCount这样解决了它:

from django.db.models import Count

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

关于python - Django过滤器manytomanyfield排除与另一个模型相关的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56058505/

10-12 16:59