Фильтр поля M2M в Django ORM
Мои модели:
class Tag(models.Model):
tag_name = models.CharField(
'Tag Name',
max_length=255,
null=True
)
class Book(models.Model):
name = models.CharField(
'Name',
max_length=255,
null=True
)
tag = models.ManyToManyField(
'Tag',
related_name='tags',
blank=True
)
Я не хочу фильтровать модель книги. В базе данных у меня есть несколько строк:
Tag
| id | name |
|-----|------|
| 1 |tag_1 |
| 2 |tag_2 |
| 3 |tag_3 |
Book
| id | name | tags |
|-----|-------|------|
| 1 |book_1 |tag_1|
| 2 |book_2 |tag_2|
| 3 |book_3 |tag_3|
| 4 |book_4 |tag_1, tag_2, tag_3|
.
Как я могу фильтровать модели книг, если я беру новую модель Book с tag=tag_1, tag_2 и хочу найти в моделях Book все модели с tag include tag_1 или tag_2.
Я хочу получить набор запросов следующим образом (для tag=tag_1, tag_2):
[(id=1, name=book_1), (id=2, name=book_2), (id=4, name=book_4)]
Если я правильно понял ваш вопрос, у вас есть книга_5, которая имеет теги tag_1 и tag_2, и вы хотите фильтровать книги на основе тегов книги_5.
Вы можете использовать value_list. Вы можете превратить ваш набор тегов в список идентификаторов и затем фильтровать книги на основе этого. Таким образом, это будет:
book_5 = Book.objects.get(name='book_5')
has_book_5_tags = Book.objects.filter(tag__id__in=book_5.tag.all().values_list('id',flat=True))