Python 在Django模型中使用save()会产生TypeError

Python 在Django模型中使用save()会产生TypeError,python,django,django-models,save,custom-fields,Python,Django,Django Models,Save,Custom Fields,*****使用Django 1.11.x和Python 3.6***** 我试图学习如何在Django模型(models.py)中使用save()方法。这里有两个字段我想成为自定义的“计算”字段(唯一id和年龄) 首先,我启动字段变量,然后基于现有字段定义方法/属性,然后尝试将方法结果保存到我创建的字段中 from django.db import models from dateutil.relativedelta import relativedelta from datetime impo

*****使用Django 1.11.x和Python 3.6*****

我试图学习如何在Django模型(models.py)中使用save()方法。这里有两个字段我想成为自定义的“计算”字段(唯一id和年龄)

首先,我启动字段变量,然后基于现有字段定义方法/属性,然后尝试将方法结果保存到我创建的字段中

from django.db import models
from dateutil.relativedelta import relativedelta
from datetime import datetime

class Person(models.Model):
    unique_id = models.CharField(max_length=6, primary_key=True)
    age = models.IntegerField()
    last_name = models.CharField(max_length=25)
    birth_date = models.DateField()
    city_of_birth = models.CharField(max_length=25)

    @property
    def get_unique_id(self):
        a = self.last_name[:2].upper()     #First 2 letters of last name
        b = self.birth_date.strftime('%d')     #Day of the month as string
        c = self.city_of_birth[:2].upper()     #First 2 letters of city
        return a + b + c 

    @property
    def get_age(self):
        return relativedelta(self.birth_date.days, datetime.date.now()).years

    def save(self, *args, **kwarg):
        self.unique_id = self.get_unique_id()
        self.age = self.get_age()
        super(Person, self).save(*args, **kwarg)

    def __str__(self):
        return self.unique_id
首先,我创建了5个字段。其中2个是占位符:唯一的id和年龄。然后我定义了两个@property方法,每个方法返回不同类型的结果。“get_unique_id”函数可以工作,但我无法获得存储在数据库中的结果。“get_age”功能可能工作,也可能不工作。我还没能生产出来

我的主要问题是如何正确地使用save()函数,用我的“计算字段”方法(get_unique_id和get_age)覆盖初始字段值(unique_id和age)

我的主要问题是当我添加一个人时(使用/Admin中的Person ModelForm),它会产生一个TypeError:“str”对象不能在“self.unique\u id=self.get\u unique\u id()”行调用。我目前正在使用管理界面进行测试

最后,我需要学习如何在表单中不显示这两个字段,因为它们将基于其他字段进行计算。我想我可能已经找到了关于Meta的文档,这可能会有所帮助。另外,我希望unique_id字段是主键,因此我将此选项添加到初始字段

关于*args和**kwargs,我还有第二个问题(很抱歉对Django不熟悉)。把它们留在那里可以吗?我真的不确定我需要使用哪些参数,如果有的话,以及是否有必要在代码中包含*args和**kwargs


注意:对于昨天帮助我使用此应用程序的所有人,我非常感谢您的帮助。我认为这与我以前的问题不同,尽管我使用的代码很多。p> 属性不可调用。当您访问
self.get_unique_id
时,Python在幕后调用由
@property
修饰的底层方法,在本例中,该方法返回一个字符串。你不必再打电话了,别打电话了:

def save(self, *args, **kwarg):
    self.unique_id = self.get_unique_id
    self.age = self.get_age
    super(Person, self).save(*args, **kwarg)

根据@DanielRoseman的评论,你不需要在数据库中存储年龄。只要在需要的时候计算一下。您可以将
get_age
重命名为
age
,并删除
age
字段,使
age
成为属性。

属性不可调用。当您访问
self.get_unique_id
时,Python在幕后调用由
@property
修饰的底层方法,在本例中,该方法返回一个字符串。你不必再打电话了,别打电话了:

def save(self, *args, **kwarg):
    self.unique_id = self.get_unique_id
    self.age = self.get_age
    super(Person, self).save(*args, **kwarg)

根据@DanielRoseman的评论,你不需要在数据库中存储年龄。只要在需要的时候计算一下。您可以将
get_age
重命名为
age
,并删除
age
字段,使
age
成为一个属性。

不要这样做。没有必要将年龄设置为单独的字段,因为它将过时。当你需要的时候计算一下。好的,谢谢。我可以接受这个。唯一的id更重要。不要这样做。没有必要将年龄设置为单独的字段,因为它将过时。当你需要的时候计算一下。好的,谢谢。我可以接受这个。唯一的id是更重要的。这成功了!谢谢你。“罗兰尼,你可以考虑接受答案,如果Helpdii低于15的评级,所以他们不喜欢我的意见:”RonRaney Haha,你不需要ReP接受答案。只要勾选答案旁边箭头下方的复选标记。我开始检查我所有的问题,现在我的声誉达到21。谢谢现在我可以投票了,这成功了!谢谢你。“罗兰尼,你可以考虑接受答案,如果Helpdii低于15的评级,所以他们不喜欢我的意见:”RonRaney Haha,你不需要ReP接受答案。只要勾选答案旁边箭头下方的复选标记。我开始检查我所有的问题,现在我的声誉达到21。谢谢现在我可以投票了。