Можно ли использовать динамические атрибуты с объектами Q в Django 1.5.1?
Я использую django-transmeta
для переведенных полей, и мне нужно выполнить некоторые поиски, используя эти переведенные поля.
Предположим, у нас есть Модель с переводимым полем под названием translated_field
,
При первом подходе мы можем думать что-то, как обычно, как:
Q(translated_field__icontains="some value") # This fails, as `translated_field` field does not exist
Второй подход заключается в жестком кодировании всех возможных языковых версий. Например:
Q(translated_field_en__icontains="some value") # English version
Q(translated_field_es__icontains="some value") # Spanish version
# Add as many as available languages
Этот второй вариант кажется действительно жестко запрограммированным, и я удивляюсь возможному третьему варианту:
Q(getattr("translated_field") + get_language() + "__icontains"="some value") # pseudocode
Или даже лучше... есть ли вариант с **kwargs, доступным с использованием объектов Q?
Спасибо!
1 ответ
Решение
Вы можете генерировать имя аргумента поиска динамически, использовать его как ключ словаря, а затем использовать **kwargs
при создании объекта Q.
field_name_contains = "translated_field" + get_languaage() + "__icontains")
kwargs = {field_name_contains: "some value"}
q = Q(**kwargs)