簡體   English   中英

Django 模型方法或計算作為數據庫中的字段

[英]Django Model Method or Calculation as Field in Database

使用 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 模型中的字段。 執行這些操作時的最佳實踐是什么? 我是否需要先初始化字段,然后對這些字段進行某種更新查詢?

注意:據我了解,當前使用“屬性”的代碼可用於在視圖中呈現,但並未存儲在數據庫中。

提前致謝! 請幫助我改進我已經擁有的。

更新:這是對我有用的代碼。 問題是我需要在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

您必須覆蓋 Model Personsave方法並在 Model 中創建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_idclean並將返回語句替換為:

self.unique_id = a + b + c

如果您確定這總是會生成一個唯一的字符串,請考慮將此字段設為主鍵。 但是,如果此模型已經遷移,則不能將其命名為id ,因為 Django 已經為您創建了一個字段id作為AutoField ,因此如果您設置了名稱 'id'(您可以稍后南瓜)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM