使用Django~ = 1.11和Python 3.6
我需要将'计算'变量存储为Django模型数据库中的字段。
这是一个模型:
from django.db import models
from datetime import date
class Person(model.Model)
"Last Name"
last_name = models.CharField(max_length=25)
"Birthday"
birth_date = models.DateField()
"City of birth"
city_of_birth = models.CharField(max_length=25)
我正在使用这些字段创建唯一ID。具体来说,我将每个字段的部分组合成一个字符串变量(详情如下)。我能够将其作为属性使用,但我不知道如何在数据库中存储计算字段。
"Unique ID"
def get_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
unique_id = property(get_id)
我想和Age做类似的事情。这是我的计算结果:
"Age calculated from Birth Date"
def get_age(self):
return int((datetime.date.now() - self.birth_date.days) / 365.25)
age = property(get_age)
所以我想将UniqueID和Age变量存储在数据库中,作为Person模型中的字段。这样做的最佳做法是什么?我是否需要首先初始化字段,然后对这些字段进行某种更新查询?
注意:据我所知,使用'property'的当前代码适用于在视图中呈现,但它不存储在数据库中。
提前致谢!请帮助我改进我已有的东西。
更新 这是适合我的代码。问题是我需要在 self.unique_id = self.get_unique_id 之后删除save()部分中的括号。有人建议从数据库中删除年龄,并将其保留为属性。
class Person(models.Model):
unique_id = models.CharField(max_length=6, blank=True)
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 age(self):
return relativedelta(self.birth_date.days, datetime.date.now()).years
def save(self, *args, **kwarg):
self.unique_id = self.get_unique_id
super(Person, self).save(*args, **kwarg)
def __str__(self):
return self.unique_id
答案 0 :(得分:7)
您必须覆盖模型save
的{{1}}方法,并在模型中创建Person
和unique_id
字段。
age
答案 1 :(得分:1)
模型对此类事件采用clean
方法:
此方法应用于提供自定义模型验证,并根据需要修改模型上的属性。例如,您可以使用它自动为字段提供值,或者进行需要访问多个字段的验证
松散属性并添加一个名为'unique_id'的字段,该字段应该是CharField。将get_id
重命名为clean
并将return语句替换为:
self.unique_id = a + b + c
如果您确定这始终会生成唯一字符串,请考虑将此字段作为主键。但是,如果此模型已经迁移,则无法将其命名为id
,因为Django已经为您创建了一个id
字段作为AutoField
,因此,如果您要进行两次迁移,则需要进行两次迁移。重新设置名称'id'(您可以在以后压缩)。