2017-06-29 29 views
1

*****使用Django 1.11.x和Python 3.6 *****在Django模型使用save()產生類型錯誤

我想學習如何使用save()方法的工作一個Django模型(models.py)。這裏有兩個字段,我想成爲自定義,'計算'字段(unique_id和年齡)。

首先我啓動字段變量,然後根據現有字段定義方法/屬性,然後嘗試將方法結果保存到我創建的字段中。

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和年齡。然後我定義了兩個@property方法,每個方法返回不同類型的結果。 「get_unique_id」函數可以工作,但我無法獲得存儲在數據庫中的結果。 「get_age」函數可能會或可能不會工作。我還沒有能夠製作它。

我的主要問題是如何正確使用save()函數與我的「計算領域」的方法來覆蓋初始字段值(UNIQUE_ID年齡)(get_unique_idget_age) 。

我的主要問題是,當我加人(使用人的ModelForm在/管理員)時,它產生一個類型錯誤:「STR」對象不是在該行可調用self.unique_id = self.get_unique_id()「。我目前正在使用Admin界面進行測試。

最後,我需要學習如何不在表單中顯示這兩個字段,因爲它們將根據其他字段進行計算。我想我可能在Meta上找到了可能有所幫助的文檔。此外,我希望unique_id字段是主鍵,所以我將此選項添加到了初始字段。

我有一個關於* args和** kwargs的第二個問題(我對django的新手道歉)。離開他們在那裏可以嗎?我真的不確定我需要使用哪些參數,以及是否有必要在代碼中包含* args和** kwargs。

注意:對於任何人誰昨天幫我這個應用程序,我真的很感謝你的幫助。我認爲這與我以前的問題不同,儘管我使用了大部分相同的代碼。

+0

不要這樣做。將年齡設置爲單獨的字段沒有意義,因爲它會過時。當你需要時計算它。 –

+0

好的,謝謝。我可以忍受這一點。unique_id是更重要的一個。 –

回答

2

屬性不可調用。當你訪問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) 

OTOH,由@ DanielRoseman的評論去,你不需要年齡存儲在數據庫中。只需在需要時計算它。您可以將get_age重命名爲age並刪除age字段,因此age成爲屬性。

+0

這工作!謝謝。 –

+0

@RonRaney你可能會考慮接受答案,如果它有幫助 –

+0

我低於15分,所以他們不喜歡我的意見:) –