基于另一个字段

时间:2016-01-14 13:36:29

标签: python-2.7 django-models django-orm

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

现有模式(仅举例)

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因为我无法访问类实例。

任何人都可以帮助我同样的将非常感激。

1 个答案:

答案 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更新可能会使您的代码工作。