2010-04-02 37 views
5

我有一個模型:如何在運行時計算Django模型字段?

class Person (models.Model): 
    name  = models.CharField() 
    birthday = models.DateField() 
    age  = models.IntegerField() 

我要讓age場表現得像一個屬性:

def get_age (self): 
     return (datetime.datetime.now() - self.birthday).days // 365 

    age = property (get_age) 

,但在同一時間,我需要age成爲一個真正的現場,這樣我就可以找到它在Person._meta.fields,並給它分配屬性:age.help_text = "Age of the person"

很明顯,我不能只是重寫Person.save()方法來計算和存儲age在數據庫中,因爲它不可避免地會在以後出錯(實際上,它根本不應該存儲在數據庫中)。

實際上,我現在不需要安裝人員,但一個很好的解決方案必須具有設置功能。

Django有可能嗎?或者對我的問題有更多pythonic和djangoic的方法?

+0

爲什麼重寫save方法不起作用? – 2010-04-02 19:47:58

+0

因爲下次我們得到一個模型實例可能是錯誤的。這是一個簡單的例子,我實際上有更復雜的領域,其價值觀變化不可預測,依賴於其他幾個因素。 – 2010-04-03 17:18:58

回答

3

你正在以一種奇怪的方式去解決它。你只需要存儲生日(你已經在做)。

如果您需要根據年齡進行查詢,考慮年齡,然後搜索符合要求的生日。

from datetime import datetime 

# get people over 50 
age = 50 # in years 
age_ago = datetime.now() - age # use timedelta i don't know the syntax off the top of my head 
Person.objects.filter(birthday__lte=age_ago) # people whose birthday is before fifty years ago 

你自己說的「[年齡]不應該被存儲在數據庫中所有」

你說得對。沒有理由擁有年齡領域......只是財產會很好。

+0

我有一個類似自動管理的應用程序,它使用字段以統一的方式顯示和編輯有關對象的信息。如果沒有我正在尋找的功能,我必須以特定方式處理這些屬性,分別存儲和處理標籤(verbose_name),help_texts等。這是尷尬和混亂。 – 2010-04-02 18:16:55

+0

你不應該只編輯'生日''生日'。無論「生日」是什麼,「年齡」總是「生日」(即現在 - 生日)的函數。這就是爲什麼我不明白你想說什麼。 – 2010-04-02 19:33:37

+0

我有一個類:'類PersonReportPrinter(ReportPrinter)'與領域'模型=人'和'列=('ID','名稱','年齡')'和類使用'Person._meta.get_field_by_name'到得到'verbose_name'和'help_text'。實際上,真正的應用程序有點複雜,有許多模型和幾個幫助類,所以解決方法太煩人了。 – 2010-04-02 22:17:48

1

另一種方式去了解它,這可能是簡單,就是使用自定義窗體管理模式。 類似這樣的:

class Person (models.Model): 
    birthday = models.DateField() 

class PersonForm(forms.ModelForm): 
    age = forms.IntegerField() # This will not be in the database 
    class Meta: 
     model = Person 
    def __init__(self, *args, **kwargs): 
     # verify instance was passed 
     instance = kwargs.get('instance') 
     if instance: 
      self.base_fields['age'].initial = (datetime.datetime.now() - self.birthday).days 
     super(PersonForm, self).__init__(*args, **kwargs) 

class FooAdmin(admin.ModelAdmin): 
    form = PersonForm 
    # Save the age in the birthday field 
    def save_model(self, request, obj, form, change): 
     obj.birthday = datetime.datetime.now() + form.cleaned_data['age'] 
     obj.save() 
相關問題