假设一个模型翻译了如下字段,我们如何使用 django-graphene 查询这些字段?
from parler.models import TranslatableModel, TranslatedFields
class Article(TranslatableModel):
#regular fields
publishing_date = models.DateTimeField(_('publishing date'),
default=now)
# translated fields
translations = TranslatedFields(
title=models.CharField(_('title'), max_length=234),
slug=models.SlugField(
verbose_name=_('slug'),
max_length=255,
db_index=True,
blank=True,
),
meta_title=models.CharField(
max_length=255, verbose_name=_('meta title'),
blank=True, default=''),
meta_description=models.TextField(
verbose_name=_('meta description'), blank=True, default=''),
meta_keywords=models.TextField(
verbose_name=_('meta keywords'), blank=True, default=''),
)
Run Code Online (Sandbox Code Playgroud)
为了注册“未知”字段,我执行以下操作:
@convert_django_field.register(GeopositionField)
def convert_geofield_to_string(field, registry=None):
return graphene.String(description=field.help_text, required=not field.null)
Run Code Online (Sandbox Code Playgroud)
……但这在这里行不通。有任何想法吗?
我正在使用django-parler(django-hvad的衍生物)进行翻译.在管理员显示具有多种关系的Foreignkey字段时,django为每个字段运行一个查询:
因此,当有300个服务时,会有尽可能多的查询.
我认为get_queryset上的prefetch_related不适用于mantomany
过滤器/列表,如果我错了,请纠正我:
def get_queryset(self, request):
return super(DoctorAdmin, self).get_queryset(request).prefetch_related('translations', 'services__translations')
Run Code Online (Sandbox Code Playgroud)
对查询数量没有影响.启用缓存上parler(如笔者建议在这里)也于事无补,因为相同的查询不重复,但这些过滤器的每一项被称为在翻译项目查询(IDS每一次都是不同的).所以,我要找的是内部过滤器上的select_related/prefetch_related.如果您已经解决了这个问题,我也会同时审核您的应用程序.
我有使用 Django Parler 具有可翻译字段的模型,现在我正在尝试创建用于单元测试的对象。这是我拥有的示例模型
class Federation(TranslatableModel):
translations = TranslatedFields(
name = models.CharField('name', max_length=50)
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='federation_creator')
updater = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='federation_updater')
def __str__(self):
return self.name;
Run Code Online (Sandbox Code Playgroud)
现在我想在测试用例的设置阶段创建用于测试的对象:
Federation.objects.create(...)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何创建具有可翻译字段的对象。
我怎样才能做到这一点?
出于某种原因,我在添加到管理员时没有看到任何语言选项卡。我正在使用 Django 1.9.10。我正在使用 django-hvad 但决定尝试 parler。我在一个新项目中尝试了完全相同的代码并且它有效,但在我现有的项目中却没有。请注意,我也在使用 django-mptt。在与 mptt 模型不同的模型中尝试 parler,反之亦然。
settings/base.py
# Translations
gettext = lambda s: s
LANGUAGES = (
('en', gettext('English')),
('ar', gettext('Arabic')),
)
LOCALE_PATHS = (
os.path.join(BASE_DIR, "locale"),
)
# # Parler Configuration
PARLER_LANGUAGES = {
None: (
{'code': 'ar', },
{'code': 'en',},
),
'default': {
'fallback': 'ar', # defaults to PARLER_DEFAULT_LANGUAGE_CODE
'hide_untranslated': False, # the default; let .active_translations() return fallbacks too.
}
}
PARLER_DEFAULT_LANGUAGE_CODE = 'ar'
Run Code Online (Sandbox Code Playgroud)
模型
class Category(MPTTModel, TranslatableModel):
slug = models.SlugField(max_length=50, unique=True, null=True, blank=True) …
Run Code Online (Sandbox Code Playgroud)