Фильтр поля 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))
Вернуться на верх