Работа с многоязычными данными (переводы) в базе данных с использованием моделей django
Я использую Python 3.9 с Django 4.1 и хочу хранить данные в моей базе данных на 3 языках, английском, французском и иврите.
В настоящее время я работаю с адресами, поэтому для страны, города и улицы у меня есть колонки name_en
, name_fr
и name_he
.
У меня есть таблицы country
, city
и street
, а также таблицы отношений CountryCity
, содержащие id страны и id города, и CountryCityStreet
, содержащие countryCityId
и streetId
.
я могу получить текущий используемый язык, используя translation.get_language()
, и я могу взять только первые 2 символа, чтобы получить желаемый результат (en, fr или he).
поэтому я создал сервисную функцию для получения первых символов:
def get_2l_lang():
lang = translation.get_language()
return lang[0:lang.find("-")]
и я создал модели для этого:
class Country(models.Model):
class Meta:
verbose_name_plural = "Countries"
name_en = models.CharField(unique=True, verbose_name="English Country Name", max_length=100)
name_fr = models.CharField(unique=True, verbose_name="French Country Name", max_length=100)
name_he = models.CharField(unique=True, verbose_name="Hebrew Country Name", max_length=100)
def __str__(self):
return getattr(self, 'name_' + get_2l_lang())
class City(models.Model):
class Meta:
verbose_name_plural = "Cities"
name_en = models.CharField(unique=True, verbose_name="English City Name", max_length=100)
name_fr = models.CharField(unique=True, verbose_name="French City Name", max_length=100)
name_he = models.CharField(unique=True, verbose_name="Hebrew City Name", max_length=100)
def __str__(self):
return getattr(self, 'name_' + get_2l_lang())
class Street(models.Model):
name_en = models.CharField(unique=True, verbose_name="English Street Name", max_length=100)
name_fr = models.CharField(unique=True, verbose_name="French Street Name", max_length=100)
name_he = models.CharField(unique=True, verbose_name="Hebrew Street Name", max_length=100)
def __str__(self):
return getattr(self, 'name_' + get_2l_lang())
class CountryCity(models.Model):
class Meta:
unique_together = ('country', 'city',)
country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name='Country')
city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name='City')
def __str__(self):
return getattr(self.country, 'name_' + get_2l_lang()) + ', ' + \
getattr(self.city, 'name_' + get_2l_lang())
class CountryCityStreet(models.Model):
class Meta:
unique_together = ('countryCity', 'street',)
countryCity = models.ForeignKey(CountryCity, on_delete=models.CASCADE, verbose_name='Country & City')
street = models.ForeignKey(Street, on_delete=models.CASCADE, verbose_name='Street')
def __str__(self):
return getattr(self.countryCity.country, 'name_' + get_2l_lang()) + ', ' + \
getattr(self.countryCity.city, 'name_' + get_2l_lang()) + ', ' + \
getattr(self.street, 'name_' + get_2l_lang())
пока все хорошо.
У меня возникают проблемы, когда я хочу отобразить его на основе языка на странице администратора, Во-первых... я не смог найти способ переключать языки в админке, но все же допустим мы используем настроенную локаль системы.
Я зарегистрировался в админке, чтобы показать модель CountryCityStreet
, у нее есть внешний ключ для страны и города, и еще один для улицы. чтобы правильно отобразить ее, я создал эту модель админки:
class CountryCityStreetAdmin(admin.ModelAdmin):
list_display = ('get_country', 'get_city', 'street')
@admin.display(description='Country', ordering='countryCity__country__name_en')
def get_country(self, obj):
return getattr(obj.countryCity.country, 'name_' + get_2l_lang())
@admin.display(description='City', ordering='countryCity__city__name_en')
def get_city(self, obj):
return getattr(obj.countryCity.city, 'name_' + get_2l_lang())
теперь здесь в ordering
я не могу сделать его динамическим на основе функции get_2l_lang()
.
Когда я читал документацию django о переводе на https://docs.djangoproject.com/en/4.1/topics/i18n/translation/, но я не смог найти ничего о хранении данных на разных языках.
Я пытался найти в Google другие пакеты и нашел django-hvad
, который выглядит потрясающе и точно соответствует моим потребностям, но он очень старый и тестировался на django 1.9.2
, поэтому я не могу его использовать.
Итак, как я могу решить эту проблему? Как я могу сделать так, чтобы модели django знали о разных языках в БД?
Спасибо