首页 > 解决方案 > 在 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&#39;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&#39;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&#39;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&#39;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

解决方案


您的情况有一个更简单的解决方案,我强烈建议您使用Django 模型翻译库。很酷的一点是它依赖于请求的Accept-Language标头,它将根据标头中传递的语言代码返回您的文本,如果它不存在,它将回退到您设置的默认语言代码。


推荐阅读