如何在django中获取翻译记录

如何在django中获取翻译记录,django,python-3.x,Django,Python 3.x,我是django框架的新手,mysql数据库中有3个表。我想从带有翻译表和图像表的主表中获取数据。 我的模特 class Country(models.Model): #id = models.IntegerField(primary_key=True) iso_code = models.CharField(max_length=2, unique=True) slug = models.CharField(max_lengt

我是django框架的新手,mysql数据库中有3个表。我想从带有翻译表和图像表的主表中获取数据。 我的模特

class Country(models.Model):
    #id             = models.IntegerField(primary_key=True)
    iso_code    = models.CharField(max_length=2, unique=True)
    slug        = models.CharField(max_length=255, unique=True)
    is_featured = models.IntegerField(max_length=1)

    class Meta:
        db_table = 'rh_countries'

class CountryTranslation(models.Model):
    country_id  = models.ForeignKey(Country, on_delete=models.CASCADE)
    name        = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    locale      = models.CharField(max_length=2)

    class Meta:
        db_table = 'rh_countries_translations'

class CountryImage(models.Model):
    country_id  = models.ForeignKey(Country, on_delete=models.CASCADE)
    image       = models.CharField(max_length=255)
    is_main     = models.IntegerField(max_length=1)

    class Meta:
        db_table = 'rh_country_images'
现在我想按地区和相关图像获取所有具有翻译记录的国家。
如果有人知道,请给出解决方案。

您可以通过使用筛选和注释来完成此操作:

from django.db.models import F

Country.objects.filter(
    countrytranslation__locale=mylocale
).annotate(
    name=F('countrytranslation__name')
)
这将导致
查询集
包含所有
国家/地区
s(对于给定的
mylocale
,具有
翻译
)。这些
Country
s将具有一个额外属性
.name
,即
国家的翻译名称

因此,如果存在翻译,那么对于
mylocale='en'
,这将导致
QuerySet
,带有
国家(name='Germany',iso_code='de')
,对于
mylocale='de'
,它将导致
国家(name='Deutschland',iso_code='de')
(这是一种特殊的格式,用来演示它是如何工作的)

注意
外键
通常不会以
\u id
结尾。Django将自动向数据库列添加
\u id
后缀。外键本身在Python/Django级别,表示为延迟加载的属性


请将您的外键重命名为
country
,而不是
country\u id
。Django将自动使用外键的
id
创建一个额外的
country\u id
列。@raj:您需要从Django.db导入它…
。models import F
。出现另一个错误,无法将关键字“country\u translation”解析为field、 选择包括:countryimage、countrytranslation、id、is_特色、iso_代码、,slug@Raj:如果您查看这些选项,很明显下划线是一个错误:)QuerySet.annotate()收到了非表达式:Country对象(countrytranslation\uu名称)。yes收到了另一个错误--QuerySet.annotate()收到了非表达式:国家/地区对象(国家/地区名称)。