如何获取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
相关产品推荐
相关产品推荐

