Django模型方法或数据库中的字段计算



使用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 calculated from Birth Date"
def get_age(self):
    return int((datetime.date.now() - self.birth_date.days) / 365.25)
age = property(get_age)

所以我想将唯一的变量和年龄变量存储在数据库中,作为人模型中的字段。这样做时最好的做法是什么?我需要先初始化字段,然后对这些字段进行某种更新查询?

注意:我的理解是,使用"属性"的当前代码在视图中起作用,但没有存储在数据库中。

预先感谢!请帮助我改善我已经拥有的东西。

更新:这是对我有用的代码。问题在于,我需要在 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

您必须覆盖Yout模型Personsave方法,并在模型中创建unique_idage字段。

from dateutil.relativedelta import relativedelta
from datetime import datetime
class Person(model.Model)
     unique_id = models.CharField(max_length=25)
     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, **kwargs):
          self.unique_id = self.get_unique_id
          self.age = self.get_age
          super(Person, self).save(*args, **kwargs)

更新:以前使用'(('调用self.get_unique_idself.get_age,这不是类属性。

模型具有用于此类物品的clean方法:

应使用此方法来提供自定义模型验证,并在您的模型上修改属性。例如,您可以使用它自动为字段提供值,或进行需要访问多个字段

的验证

如此放松该属性,并添加一个名为" unique_id"的字段,该字段应该是查尔德(Charfield(。将get_id重命名为clean,然后用以下方式替换返回语句

self.unique_id = a + b + c

如果您确定这总是会生成唯一的字符串,请考虑将此字段作为主键。但是,如果此模型已经迁移,则无法将其命名id,因为Django已经为您创建了一个字段id作为AutoField,因此,如果您设置在名称" ID"(您可以可以((可以可以((可以(,则需要进行两次迁移(您可以稍后南瓜(。

相关内容

  • 没有找到相关文章

最新更新