Создание набора django-queryset со всеми объектами, но не со всеми связанными по условию полями "многие ко многим

class Post(models.Model):
    text = models.TextField()


class Project(models.Model):
    name = models.CharField(max_length=60)
    description = models.CharField(max_length=500)

class Tag(models.Model):
    name = models.CharField(max_length=60)
    project = models.ForeignKey(Project, on_delete=models.CASCADE)


class TaggedPost(models.Model):
    org_post = models.ForeignKey(Post, on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag)

Предположим, что я определил вышеуказанные модели. Существует несколько проектов, которые все имеют несколько тегов.

Eg:

  • Project1 -> Tag1, Tag2
  • Project2 -> Tag3

Не каждый пост имеет объект TaggedPost. Например,

  • Post1 -> нет тегов
  • Post2 ->TaggedPost -> Tag1
  • Пост3 ->TaggedPost -> Tag2
  • Post4 ->TaggedPost -> Tag2, Tag3 (Здесь представлены теги нескольких проектов)

Теперь я хочу сделать набор запросов, который содержит все сообщения (также сообщения без тегов), но только теги определенного проекта.

qs.include_tags_of_project(Project1) приводит к:

  • Post1 -> нет тегов
  • Post2 -> Tag1
  • Post3 -> Tag2
  • Post4 -> Tag2

qs.include_tags_of_project(Project2) приводит к:

  • Пост1 -> без тегов
  • Post2 -> без тегов
  • Post3 -> без тегов
  • Post4 -> тег3

Есть предложения, как с этим справиться? Thx

Во-первых, получить все посты по project.id (или project.name или description). Во втором, сделайте prefetch_related, чтобы получить все теги для проекта. Prefetch поможет вам получить только теги для конкретного проекта.

Post.objects.filter(taggedposts__tags__project_id=project1.pk).prefetch_related(Prefetch('tags', queryset= Tag.objects.filter(project_id=project1.pk)))
Вернуться на верх