在 Django 模型中使用 save() 会产生 TypeError
Using save() in Django model produces TypeError
*****使用 Django 1.11.x 和 Python 3.6*****
我正在尝试学习如何在 Django 模型中使用 save() 方法 (models.py)。这里有两个字段我想自定义,'calculated' 字段(unique_id 和年龄)。
首先我初始化字段变量,然后根据现有字段定义methods/properties,然后我尝试将方法结果保存到我创建的字段中。
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 个是占位符:unique_id 和年龄。然后我定义了两个 @属性 方法,每个 return 一个不同类型的结果。 "get_unique_id" 函数有效,但我无法将结果存储在数据库中。 "get_age" 函数可能有效也可能无效。我还没制作出来
我的主要问题是如何正确使用 save() 函数覆盖初始字段值(unique_id和 age) 使用我的 'calculated field' 方法(get_unique_id 和 get_age).
我的主要问题 是当我添加一个人时(使用 /Admin 中的 Person ModelForm),它会产生一个 TypeError: 'str' 对象不可调用 在行“self.unique_id = self.get_unique_id()”。我目前正在使用管理界面进行测试。
最终,我需要学习如何在表单中不显示这两个字段,因为它们将根据其他字段进行计算。我想我可能在 Meta 上找到了可能有帮助的文档。另外,我希望 unique_id 字段为主键,所以我将此选项添加到初始字段。
我有一个关于 *args 和 **kwargs 的次要问题(很抱歉我是 Django 的新手)。把它们留在那里可以吗?我真的不确定我需要使用哪些参数(如果有的话),以及是否有必要在代码中包含 *args 和 **kwargs。
注意:对于昨天帮助我使用此应用程序的任何人,我非常感谢您的帮助。我认为这与我之前的问题不同,尽管我使用的大部分代码都是相同的。
属性不可调用。当您访问 self.get_unique_id
时,Python 调用在幕后由 @property
装饰的底层方法,在本例中 returns 是一个字符串。您不需要再次调用它,删除括号:
def save(self, *args, **kwarg):
self.unique_id = self.get_unique_id
self.age = self.get_age
super(Person, self).save(*args, **kwarg)
OTOH,根据@DanielRoseman 的评论,您不需要将年龄存储在数据库中。只需在需要时计算它。您可以将 get_age
重命名为 age
并删除 age
字段,因此 age
变为 属性.
*****使用 Django 1.11.x 和 Python 3.6*****
我正在尝试学习如何在 Django 模型中使用 save() 方法 (models.py)。这里有两个字段我想自定义,'calculated' 字段(unique_id 和年龄)。
首先我初始化字段变量,然后根据现有字段定义methods/properties,然后我尝试将方法结果保存到我创建的字段中。
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 个是占位符:unique_id 和年龄。然后我定义了两个 @属性 方法,每个 return 一个不同类型的结果。 "get_unique_id" 函数有效,但我无法将结果存储在数据库中。 "get_age" 函数可能有效也可能无效。我还没制作出来
我的主要问题是如何正确使用 save() 函数覆盖初始字段值(unique_id和 age) 使用我的 'calculated field' 方法(get_unique_id 和 get_age).
我的主要问题 是当我添加一个人时(使用 /Admin 中的 Person ModelForm),它会产生一个 TypeError: 'str' 对象不可调用 在行“self.unique_id = self.get_unique_id()”。我目前正在使用管理界面进行测试。
最终,我需要学习如何在表单中不显示这两个字段,因为它们将根据其他字段进行计算。我想我可能在 Meta 上找到了可能有帮助的文档。另外,我希望 unique_id 字段为主键,所以我将此选项添加到初始字段。
我有一个关于 *args 和 **kwargs 的次要问题(很抱歉我是 Django 的新手)。把它们留在那里可以吗?我真的不确定我需要使用哪些参数(如果有的话),以及是否有必要在代码中包含 *args 和 **kwargs。
注意:对于昨天帮助我使用此应用程序的任何人,我非常感谢您的帮助。我认为这与我之前的问题不同,尽管我使用的大部分代码都是相同的。
属性不可调用。当您访问 self.get_unique_id
时,Python 调用在幕后由 @property
装饰的底层方法,在本例中 returns 是一个字符串。您不需要再次调用它,删除括号:
def save(self, *args, **kwarg):
self.unique_id = self.get_unique_id
self.age = self.get_age
super(Person, self).save(*args, **kwarg)
OTOH,根据@DanielRoseman 的评论,您不需要将年龄存储在数据库中。只需在需要时计算它。您可以将 get_age
重命名为 age
并删除 age
字段,因此 age
变为 属性.