gpt4 book ai didi

python-2.7 - 基于另一个字段的模型字段的动态默认值

转载 作者:行者123 更新时间:2023-12-05 07:51:37 29 4
gpt4 key购买 nike

我想在现有模型中添加一个新字段,其默认值为模型中已存在的字段。

现有模型(仅供引用)

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,因为那时我没有访问类实例的权限。

任何人都可以帮助我同样将不胜感激。

最佳答案

您拥有的代码将导致数据库表中的两列具有相同的内容,这看起来像是不必要的重复。所以第一个问题是为什么需要这个?

如果你只是为了显示目的需要它,你可以只在模型类中定义一个方法或属性而不是添加一个字段,即:

class Product(models.Model):

@property
def full_name(self):
return self.name

name = models.CharField(max_length=127)

这样在数据库中您将只有name,但您将能够访问Product 实例的full_name 属性:

p = Product(name='Pr1')

p.name 会让你 "Pr1"

p.full_name 将为您提供 “Pr1”

如果您这样做是为了将来删除 name 字段,然后只使用 full_name,那么我建议您查看 migrations相反。

您还可以在模型上重新定义 save() 方法,并在调用父类(super class) save() 之前在那里分配默认值。

附言如果您刚刚起步,从 Python 2.7 迁移到 3.5 并使用最新的语言特性编写您的项目是个不错的主意。

另见 https://docs.djangoproject.com/en/1.9/topics/migrations/#migration-serializing关于 Python 2 和 Python 3 中方法序列化的问题。基本上更新到 Python 3 可能会使您的代码正常工作。

关于python-2.7 - 基于另一个字段的模型字段的动态默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34791048/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com