Django / Parler: невозможно получить доступ к переведенным полям модели в функции update_or_create

#python #django #django-models #django-parler

#python #django #django-модели #django-parler

Вопрос:

У меня есть модель, такая как показано ниже:

 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 для этой модели; Я хочу получить запись с заданным идентификатором и источником; Если она существует, я хочу обновить ее имя на 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 отдельно. Я хотел бы знать, как получить доступ к переведенным полям django с помощью функции update_or_create или функции get_or_create.
Может ли кто-нибудь помочь мне с этим, пожалуйста?

Моя версия Django: Django== 1.11.17

Комментарии:

1. Из какого пакета берутся TranslateFields

2. @iklinac : из parler.models импортируйте переводимую модель, переведенные поля

Ответ №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()
 

И как задокументировано

Внутренне django-parler сохраняет переведенные поля в отдельной модели с одной строкой на язык.

Также то же самое видно из исходного кода

Комментарии:

1. Это решение не решает мою проблему. Я хочу обновить имя объекта на 3 разных языках. Поэтому мне нужно как-то получить доступ к полю translations. Ваше решение заключается в обновлении полей одной простой модели, которая не содержит никакого поля перевода!

2. Это пример доступа к полю перевода на основе ОДНОГО языка: obj, created = MyModel.objects . language(‘de’).get_or_create(id = ‘sample’, translations__name = ‘sample_name’) . Но я хочу сделать это для НЕСКОЛЬКИХ языков одновременно.

3. Это просто ответ на ваш вопрос, который заключался в том, можете ли вы использовать update_or_create, и ответ на это: нет, вы не можете по этой конкретной причине.