You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Django UniqueConstraint中的字段名称?含表达式场景

原问题

我希望获取在Meta类中声明的UniqueConstraint的字段名称:

class Book(models.Model):
    name = CharField(...)
    author = CharField(...)

    class Meta:
        constraints = [
            UniqueConstraint(
                # fields=['name', 'author'],       # 方案1
                Lower("name"), Lower("author"),    # 方案2
                name="unique__book_author",
            ),
        ]

使用方案1时,我可以通过Book._meta.constraints[0].fields获取到('name', 'author')。但使用方案2时,Book._meta.constraints[0].fields为空,该怎么解决?


编辑1

并非所有字段都需要使用Lower这类函数。如果“author”不是CharField而是FKField,*expressions可以写成:

UniqueConstraint(Lower("name"), "author", name="unique__book_author")

解决方案

要提取这类包含数据库函数或混合字段的UniqueConstraint字段名,需要解析约束的expressions属性:

  • 遍历constraint.expressions,每个元素要么是Lower这类数据库函数实例,要么是直接的字段名字符串
  • 对于数据库函数实例,取它的expression属性即可得到对应字段名
  • 直接的字段名字符串可直接收集

示例代码:

def get_unique_constraint_fields(constraint):
    fields = []
    for expr in constraint.expressions:
        if hasattr(expr, 'expression'):
            fields.append(expr.expression)
        else:
            fields.append(expr)
    return tuple(fields)

# 使用示例
constraint = Book._meta.constraints[0]
print(get_unique_constraint_fields(constraint))
# 输出:('name', 'author') (兼容方案2和编辑1的场景)

这个方法能覆盖你提到的两种场景,如果后续遇到更复杂的表达式(比如组合函数),可以根据实际情况扩展判断逻辑。

内容的提问来源于stack exchange,提问作者cedrik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:02:23