Как фильтровать поле Multiselect в django (разделять запятыми)

моя модель

class Dictionary():
    ALLERGIES = (
        (0, 'none'),
        (1, 'a'),
        (2, 'b'),
        (3, 'c'),
        (4, 'd'),
        (5, 'e'),
        (6, 'f'),
        (7, 'g'),
        (8, 'h'),
        (9, 'i'),
        (10, 'x'),
        (11, 'y'),
        (12, 'z'),
    )
    ...
    allergies = MultiSelectField(default=0, null=True, blank=True, choices=ALLERGIES, max_choices=12)

Моя первая попытка.


dictionaries.filter(
                Q(allergies__isnull=False) & Q(allergies__icontains=pet_allergy))

пример словарей данных

id allergies
1 "1,2,3,4"
2 "1,2,10"
3 "4,5,6,7,10"
4 "6,8,12
5 null

pet_allergy = 1

Я ожидал, что будут возвращены идентификаторы 1 и 2.
Однако, id 1, 2, 3 и 4 вернулись вопреки моим ожиданиям. Потому что sql был вызван как %1%.

Моя вторая попытка

class Dictionary():
    ...
        def get_allergies(self):
        if self.allergies:
            return str(self.allergies).split(',')
        else:
            return None
dictionaries.filter(
    Q(allergies__isnull=False) & Q(get_allergies__in=pet_allergy_id)
)

>> Cannot resolve keyword 'get_allergies' into field.

Есть ли какой-нибудь хороший способ решить эту проблему?

P.S. Моя БД - mariadb. / django = v3.1

Вернуться на верх