【问题标题】:Django/Parler: unable to access the translated fields of a model in the update_or_create functionDjango/Parler:无法在 update_or_create 函数中访问模型的翻译字段
【发布时间】:2021-01-07 23:02:51
【问题描述】:

我有一个模型如下:

class MyModel(TranslatableModel):
    date_created = models.DateField(
        verbose_name=_('Date Created'), default=timezone.now)
    source = models.CharField(max_length=100, verbose_name=('Type'))
    translations = TranslatedFields(
        name=models.CharField(verbose_name=_('Name'), max_length=200)
    )

我想在这个模型上使用 update_or_create 函数;我想获取具有给定 ID 和来源的记录;如果它存在,我想用 3 种不同的语言更新它的名称。否则我想创建一个新记录。 我使用了以下代码。我试过 name_en、name__en、translations__name_en;他们都没有工作。我也尝试了 get_or_create 函数,但他们都没有使用它。

obj, created = MyModel.objects.update_or_create(
                                            id= id,
                                            source = 'tmp',
                                            defaults={
                                                    'name_en': en_name,
                                                    'name_fi': fi_name,
                                                    'name_sv': sv_name,
                                             })

我不想分别使用 get 函数和 create 函数。我想知道如何通过 update_or_create 函数或 get_or_create 函数访问 django 翻译的字段。 有人可以帮我解决这个问题吗?

我的 Django 版本: Django==1.11.17

【问题讨论】:

  • TranslateFields 来自什么包
  • @iklinac : from parler.models import TranslatableModel, TranslatedFields

标签: python django django-models django-parler


【解决方案1】:

update_or_create 创建对象/更新对象字段,它不是为在相关模型上创建相关模型/更新字段而构建的

这意味着作为样板代码的快捷方式。例如:

defaults = {'first_name': 'Bob'}
try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
    for key, value in defaults.items():
        setattr(obj, key, value)
    obj.save()
except Person.DoesNotExist:
    new_values = {'first_name': 'John', 'last_name': 'Lennon'}
    new_values.update(defaults)
    obj = Person(**new_values)
    obj.save()

作为documented

在内部,django-parler 将翻译后的字段存储在单独的 模型,每种语言一行。

source也可以看到

【讨论】:

  • 这个解决方案不能解决我的问题。我想用 3 种不同的语言更新对象的名称。所以我需要以某种方式访问​​翻译字段。您的解决方案是更新一个不包含任何翻译字段的简单模型的字段!
  • 这是一个基于 ONE 语言访问翻译字段的示例:obj, created = MyModel.objects.language('de').get_or_create(id = 'sample', translations__name = 'sample_name' ) .但我想同时为多种语言执行此操作。
  • 这只是对您的问题的回答,如果您可以使用 update_or_create 并且回答是:不,您不能出于这个特殊原因。
猜你喜欢
  • 1970-01-01
  • 2018-04-11
  • 2019-08-10
  • 1970-01-01
  • 2015-06-03
  • 2021-03-21
  • 2018-08-28
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多