#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, и ответ на это: нет, вы не можете по этой конкретной причине.