我想在现有模型中添加一个新字段,默认值为模型中已存在的字段。
现有模式(仅举例)
class Product(models.Model)
name = models.CharField(max_length=127)
修改后的模型
class Product(models.Model):
name = models.CharField(max_length=127)
full_name = models.CharField(max_length=127)
我在这里添加新字段full_name
,并希望所有现有字段的值与name
字段相同。
在完成一些解决方案后,我得到了我们可以使用默认属性定义和调用方法,如下所示:
class Product(models.Model):
def get_name(self):
return self.name
name = models.CharField(max_length=127)
full_name = models.CharField(max_length=127, default=get_name)
但这会出错:
ValueError: Could not find function dt_default in cater.models.
Please note that due to Python 2 limitations, you cannot serialize unbound method functions (e.g. a method declared and used in the same class body). Please move the function into the main module body to use migrations.
For more information, see https://docs.djangoproject.com/en/1.8/topics/migrations/#serializing-values
然后我在课外定义了这个方法,但后来我无法访问self.name
因为我无法访问类实例。
任何人都可以帮助我同样的将非常感激。
答案 0 :(得分:0)
您拥有的代码将导致数据库表中具有相同内容的两列,看起来像不需要的重复。所以第一个问题是为什么你需要这个?
如果您只是为了显示目的而需要它,您可以在模型类中定义方法或属性,而不是添加字段,即:
class Product(models.Model):
@property
def full_name(self):
return self.name
name = models.CharField(max_length=127)
这种方式在数据库中,您只有name
,但您可以访问full_name
个实例上的Product
属性:
p = Product(name='Pr1')
p.name
会给你"Pr1"
p.full_name
会给你"Pr1"
。
如果你这样做是为了将来放弃name
字段,然后只使用full_name
,那么我建议你改为migrations。
此外,您可以在模型上重新定义save()
方法,并在调用超类save()
之前进行默认分配。
P.S。如果您刚刚开始,从Python 2.7迁移到3.5并使用最新语言功能编写项目并不是一个坏主意。
另请参阅https://docs.djangoproject.com/en/1.9/topics/migrations/#migration-serializing关于Python 2和Python 3中方法序列化的问题。对Python 3的Basiclybup更新可能会使您的代码工作。