Python 使用django modeltranslation的语言无关查询

Python 使用django modeltranslation的语言无关查询,python,django,django-modeltranslation,Python,Django,Django Modeltranslation,我目前开始在django应用程序中使用django modeltranslation,我想进行一个查询来检索模型的实例,与系统中设置的语言无关。 例如,我有以下模型: class Product(models.Model): description = models.CharField(max_length=200) sku = models.CharField(unique=True, null=False, max_length=30) price = models.

我目前开始在django应用程序中使用django modeltranslation,我想进行一个查询来检索模型的实例,与系统中设置的语言无关。 例如,我有以下模型:

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
sku-002
的实例,以检索产品的价格(与语言无关)

但是,这将返回一个空的
多语言查询集
。 只有以下内容返回正确的产品实例

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

我猜这是django modeltranslation的预期行为,但有时找到独立于该语言的实例是可行的

Product.objects.filter(sku='sku-002') 
解决方案可以是迭代所有
语言
,并尝试查找每种语言的实例:

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/27418377/django-modeltranslation-queries-fallback
它看起来像是当前的行为(查询期间不支持回退)。 在stackoverflow链接中,建议使用以下链接:
.filter(Q(title\u de='hello')| Q(title\u en='hello'))


您可以看看对于所有语言一起使用postgres jsonb字段的包(django modeltrans、django nece)是否更好地支持这一点。我没有测试过任何东西,但我在django modeltrans上读到了关于“_i18n”和django nece中的其他支持。

请参见此处:
https://stackoverflow.com/questions/27418377/django-modeltranslation-queries-fallback
它看起来像是当前的行为(查询期间不支持回退)。 在stackoverflow链接中,建议使用以下链接:
.filter(Q(title\u de='hello')| Q(title\u en='hello'))

您可以看看对于所有语言一起使用postgres jsonb字段的包(django modeltrans、django nece)是否更好地支持这一点。我没有测试过任何东西,但我在django modeltrans上读到了关于“_i18n”和django nece中的其他支持

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