Можно ли использовать динамические атрибуты с объектами 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)
Другие вопросы по тегам