【问题标题】:Python: How to join an operator?Python:如何加入运营商?
【发布时间】:2021-07-29 14:05:47
【问题描述】:

我目前正在开发一个支持 i18n 的 Django 应用程序。 这是通过为给定字段的每种语言提供一个字段来实现的。

示例模型:

class Article(models.Model):
    title_en = models.CharField()
    title_de = models.CharField()
    title_fr = models.CharField()

    # etc...

(在后台这是使用django-translated-fields 自动完成的)

我现在想用给定的title 过滤Articles。 title 应检查每种可用语言。 (所以在这种情况下title_entitle_detitle_fr)。

如果只有一个title,我可以这样查询:

Article.objects.filter(title=my_title)

我不想用这个:

Article.objects.filter(Q(title_en=my_title) | Q(title_de=my_title) | Q(title_fr=my_title))

因为这些字段是动态创建的,并且可用的语言可能会发生变化。

我的问题

我需要使用__union__ 运算符以某种方式加入课程。

我想出了这个:

Article.objects.filter(*[
    Q(**{
        f"name_{code}": my_name
    })
    for code in available_languages
])

但缺少连接。

有什么方法可以做到这一点吗?或者有没有更好的方法来过滤名字?

【问题讨论】:

    标签: python django django-models django-i18n django-filters


    【解决方案1】:

    如果您有可用语言列表,您可以使用:

    available_languages = ['en', 'de', 'fr']
    
    q_filter = Q(
        *[Q((f'title_{code}', my_title)) for code in available_languages],
        _connector=Q.OR
    )
    
    Article.objects.filter(q_filter)

    【讨论】:

    • 我不知道_connector!有时看看源代码是个好主意;)
    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2011-07-31
    • 2012-05-10
    • 2011-05-16
    • 2018-06-07
    相关资源
    最近更新 更多