django - 在 prefetch_related() 中使用 Prefetch 应用过滤器
问题描述
我正在创建一个多语言项目。我正在使用 2 个模型来保存数据。对于模型 1 中的所有语言(如图像)和模型 2 中的文本,使用 ForeignKey 到模型 1 的字段都相同。
class FidelityClubs(models.Model):
image = models.ImageField(upload_to='admin/fidelity_clubs/')
class FidelityClubTexts(models.Model):
title = models.CharField(max_length=255)
content = RichTextField()
language = models.ForeignKey('van_admin.Languages', on_delete=models.CASCADE, default='1')
club = models.ForeignKey('van_admin.FidelityClubs', on_delete=models.CASCADE, related_name='texts')
有一种默认语言。所有内容将以默认语言(法语)提供。如果用户选择另一种语言,我有该语言的搜索内容,如果该语言的内容不可用,我必须以默认语言显示内容。我使用这个查询。
fidelities = FidelityClubs.objects.all().prefetch_related(Prefetch('texts', FidelityClubTexts.objects.filter(language__code=lang_code)))
我通过 API 发送这些数据。这是显示这样的数据。
{
"image": "http://127.0.0.1:8000/media/admin/fidelity_clubs/logo-1.png",
"texts": [
{
"id": 9,
"title": "CosmetiCar en",
"content": "<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, CosmetiCar Informaton Lorem Ipsum is simply dummy text of the printing and typesetting industry. en</p>",
"language": 2,
"club": 13
}
]
},
{
"image": "http://127.0.0.1:8000/media/admin/fidelity_clubs/logo-2.png",
"texts": []
},
这是行不通的。如果数据以所需语言提供,那么没关系,但如果没有,则什么也没有显示。如何用默认语言的数据替换空白数据。
如果我这样to_attrs
使用Prefetch
fidelities = FidelityClubs.objects.all().prefetch_related(Prefetch('texts', FidelityClubTexts.objects.filter(language__code=lang_code), to_attr='l_texts'))
它以所有语言显示数据。
{
"image": "http://127.0.0.1:8000/media/admin/fidelity_clubs/logo-1.png",
"texts": [
{
"id": 1,
"title": "CosmetiCar fr",
"content": "<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, CosmetiCar Informaton Lorem Ipsum is simply dummy text of the printing and typesetting industry. fr</p>",
"language": 1,
"club": 13
},
{
"id": 9,
"title": "CosmetiCar en",
"content": "<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, CosmetiCar Informaton Lorem Ipsum is simply dummy text of the printing and typesetting industry. en</p>",
"language": 2,
"club": 13
}
]
},
{
"image": "http://127.0.0.1:8000/media/admin/fidelity_clubs/logo-2.png",
"texts": [
{
"id": 2,
"title": "Brandrup fr",
"content": "<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, CosmetiCar Informaton Lorem Ipsum is simply dummy text of the printing and typesetting industry. fr</p>",
"language": 1,
"club": 14
}
]
},
任何人都可以帮忙吗?
解决方案
您的情况有一个更简单的解决方案,我强烈建议您使用Django 模型翻译库。很酷的一点是它依赖于请求的Accept-Language
标头,它将根据标头中传递的语言代码返回您的文本,如果它不存在,它将回退到您设置的默认语言代码。
推荐阅读
- javascript - 位置:固定在 IE 浏览器中无法处理选项标签
- android - 为什么多边形不能填充颜色?
- asp.net-mvc - 为 asp.net 创建 docker 时 gcloud 中的 kubernetes 超级错误
- ios - 读取没有结构/模型的 JSON 属性
- spring - 如何使用 Lease 自定义 ServerRSocketFactory
- python - Gstreamer-CRITICAL **: gst_poll_read_control: assertion 'set != NULL' failed - (多次执行测试用例后出现错误)
- regex - 正则表达式找到模式
- android - 意外隐式转换为 TabLayout:布局标记是 TableLayout
- abap - ABAP ADT 先决条件?
- mysql - 来自同一个表的多个求和查询和多个 where 条件