在 Django ORM 中进行查询时,有没有办法覆盖已经定义的字段?

问题描述 投票:0回答:1

为了更好地解释我的问题,让我们考虑一下我有一个支持多种语言的应用程序,让我们看一下这个代码示例:

class SomeModel(models.Model):
    title = models.CharField(max_length=255) # kept for backward comnpatibility only
    title_en = models.CharField(max_length=255)
    title_fr = models.CharField(max_length=255)
    ...

知道当前语言是英语(en - 通过使用

django.utils.translation.get_language
获得它),我执行此查询:

SomeModel.objects.get(title="some title")

生成此 SQL 查询:

SELECT * FROM some_models WHERE title='some title';

但是,我正在寻找的是一种基于当前语言自动生成这样的查询的方法而不更改上面的ORM查询

# when language is English:
SELECT * FROM some_models WHERE title_en='some title';

# when language is French:
SELECT * FROM some_models WHERE title_fr='some title';

我尝试过使用注释,但 Django 不允许覆盖模型中已定义的字段。

请记住,我正在寻找的解决方案需要与其他方法配合使用,例如

filter
values_list
等。

python django django-models django-orm
1个回答
0
投票

不要为每种语言创建单独的字段,而是创建一个模型字段来存储标题,并创建另一个字段用于语言类型选择(例如,“en”表示英语,“fr”表示法语)。 `

从 django.db 导入模型 从 django.utils.translation 导入 get_language

类 SomeModel(models.Model):

title = models.CharField(max_length=255)
language = models.CharField(max_length=255, choices=[('english', 'English'), ('frrench', 'French')])

当前语言 = get_language()

SomeModel.objects.get(title_en="某个标题", language=current_language) `

这种方法具有可扩展性,因为您可以轻松添加对其他语言的支持,而无需修改模型结构。

它还提供了查询的灵活性,允许您根据语言类型进行过滤、排除或执行其他操作。

© www.soinside.com 2019 - 2024. All rights reserved.