Создание набора 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)))