Python 在Django模型中使用save()会产生TypeError
*****使用Django 1.11.x和Python 3.6***** 我试图学习如何在Django模型(models.py)中使用save()方法。这里有两个字段我想成为自定义的“计算”字段(唯一id和年龄) 首先,我启动字段变量,然后基于现有字段定义方法/属性,然后尝试将方法结果保存到我创建的字段中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
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。谢谢现在我可以投票了。