Фильтрация по CharField выбирает текстовое свойство - PullRequest
0 голосов
/ 29 апреля 2020

Как вы можете фильтровать по тексту выбора вместо клавиши выбора?

Предположим, у вас есть следующее CharField в модели:

CHOICES = ( ('FI', 'First'), ('SE', 'Second'), ('TH', 'Third') )
choiceField = models.CharField(max_length=2, choices=CHOICES)

Затем вы пытаетесь отфильтровать его в посмотреть так:

query_in_choice_field = Model.objects.filter(choiceField__contains=query)

запрос является строкой, это может быть 'третий' или 'ir'

Этот фильтр проверяет только 'FI', ' SE 'и' TH '.

Как бы вы фильтровали по «Первому», «Второму» и «Третьему»?

1 Ответ

2 голосов
/ 29 апреля 2020

Вы не можете сделать это из коробки. Второе значение из набора CHOICES - это значение, которое отображается в раскрывающемся списке, например, в Django -admin. Первое значение - это то, которое хранится в базе данных.

Что вы можете сделать, это отфильтровать его в python вместо попытки выполнить запрос базы данных, например,

def get_containing(choices, needle):
    containing = []
    for k, v in choices:
        if needle in v:
            containing.append(k)
    return containing


query = 'ir'
qs = Model.objects.filter(choiceField__in=get_containing(Model.CHOICES, query))
print(qs)  # Objects where selected choice is 'FI' or 'TH'
...