Python中Django框架与Python变量名末尾下划线冲突问题如何解决

在 Python 中,有些变量名已经存在内置的方法了,比如id, type等. Python 推荐的做法是在后面加一个下划线,比如id_, type_这样来避免覆盖内置方法.然而 Django 的 ORM 中会强制检查,禁止字段名末尾使用下划线......

这样的话,应该如何解决好一点呢......


Python中Django框架与Python变量名末尾下划线冲突问题如何解决
4 回复

后面再加一个字母……


这个问题在Django里挺常见的,主要是Django的ORM字段名和Python关键字或者内置函数名冲突了。比如你想给模型加个class字段,但class是Python关键字,直接写会报语法错误。

Django官方给的解决方案就是在字段定义里加个db_column参数,让数据库里的列名和Python里的属性名分开。看下面这个例子就明白了:

from django.db import models

class Student(models.Model):
    # 这里属性名用 class_,但数据库里存的列名是 class
    class_ = models.CharField(max_length=50, db_column='class')
    name = models.CharField(max_length=100)
    
    def __str__(self):
        return f"{self.name} - {self.class_}"

这么干有几个好处:

  1. 代码里你可以用student.class_来访问,读起来很自然
  2. 数据库里列名还是class,跟你原来的设计保持一致
  3. 做查询的时候,Django会自动处理好这个映射关系

如果你已经在用这个模型了,记得生成并运行迁移:

python manage.py makemigrations
python manage.py migrate

总结一下,用db_column参数就能干净利落地解决命名冲突。

xx_id
xx_type


然后这样在 orm 中操作就变成了 xxx.xxx_id, xxx.xxx_type 这样了…

回到顶部