Независимый от языка запрос с помощью django-modeltranslationPython

Программы на Python
Ответить
Anonymous
 Независимый от языка запрос с помощью django-modeltranslation

Сообщение Anonymous »

В настоящее время я начал использовать django-modeltranslation в приложении Django и хотел бы сделать запрос для получения экземпляра модели независимо от языка, установленного в системе.
Например, у меня есть следующая модель:

Код: Выделить всё

class Product(models.Model):
description = models.CharField(max_length=200)
sku = models.CharField(unique=True, null=False, max_length=30)
price = models.DecimalField(max_digits=8, decimal_places=2)
и в файле Translation.py следующее:

Код: Выделить всё

class ProductTranslationOptions(TranslationOptions):
fields = ('description', 'sku')

translator.register(Product, ProductTranslationOptions)

и настройки Django:

Код: Выделить всё

gettext = lambda s: s
LANGUAGES = (
('en', gettext('English')),
('de', gettext('German')),
)

MODELTRANSLATION_LANGUAGES = ('en', 'de')
MODELTRANSLATION_DEFAULT_LANGUAGE = 'en'

MODELTRANSLATION_FALLBACK_LANGUAGES = ('en',)
Давайте создадим экземпляр продукта:

Код: Выделить всё

Product.objects.create(description_en='product en', description_de='product de', sku_en='sku-001', sku_de='sku-002', price=10.0)
Теперь я хочу найти экземпляр с артикулом sku-002, чтобы получить цену продукта (независимую от языка).

Код: Выделить всё

Product.objects.filter(sku='sku-002')
Однако при этом возвращается пустой MultilingualQuerySet.
Только следующий код возвращает правильный экземпляр продукта.

Код: Выделить всё

Product.objects.filter(sku_de='sku-002')
или

Код: Выделить всё

from django.utils import translation
translation.activate('de')
Product.objects.filter(sku='sku-002')
Думаю, это предполагаемое поведение django-modeltranslation, но иногда было бы практично найти экземпляр, независимый от языка.

Решением может быть перебор всех ЯЗЫКОВ и попытка найти экземпляр для каждого языка:

Код: Выделить всё

from django.conf import settings

LANGUAGES = list(getattr(settings,
'MODELTRANSLATION_LANGUAGES',
(l[0] for l in settings.LANGUAGES)))

def find_product_by_sku(sku):
for language in LANGUAGES:
product = Product.objects.filter(**{"sku_{}".format(language): sku})
if product:
return product
Однако это не очень практично, особенно для существующего приложения, код которого нужно будет корректировать в нескольких местах. Есть ли способ напрямую использовать диспетчер наборов запросов для получения экземпляра независимо от языка?

Подробнее здесь: https://stackoverflow.com/questions/590 ... ranslation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»