Фильтр Django Manytomanyfield исключает объекты, связанные с другой моделью - PullRequest
1 голос
/ 09 мая 2019

У меня есть 2 модели, File и Fileset:

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 объектов:

  • File1
  • File2
  • 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 Ответ

1 голос
/ 09 мая 2019

Я решил это с помощью annotate и Count следующим образом:

from django.db.models import Count

File.objects
.annotate(fileset_count=Count('fileset_files__uuid'))
.filter(fileset_count=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...