2009-08-27 29 views
3

我有一個模型,保存用戶地址。此模型必須具有first_name和last_name字段,因爲人們想將地址設置爲收件人(如他的公司等)。我想要實現的是:Django空場後備

  • 如果在地址fist_name /姓氏字段填 - 簡單地返回現場
  • 如果在地址fist_name /姓氏字段爲空 - 取corrresponding場數據從指向正確django.auth.models.User一個ForeignKey
  • 我想這將被視爲普通的Django場,這將是目前在領域中查找
  • 我不想創建一個方法,因爲這是一個重構,Address.first_name/last_name用於應用程序的各個位置(也用於模型表單等),所以我需要這樣對我來說就像po ssible要不然我會在很多地方鼓搗左右

感謝您的幫助:)

回答

5

這裏有兩個選項。首先是創建一個方法來動態查找它,但使用裝飾器,以便其他代碼仍然可以使用直屬屬性訪問。

class MyModel(models.Model): 
    _first_name = models.CharField(max_length=100, db_column='first_name') 

    @property 
    def first_name(self): 
     return self._first_name or self.user.first_name 

    @first_name.setter 
    def first_name(self, value): 
     self._first_name = value 

即使相關用戶發生更改,也會始終引用first_name的最新值。你可以得到/準確設置屬性,你會一個屬性:myinstance.first_name = 'daniel'

另一種選擇是如此,它並當您保存查詢重寫模型save()方法:

def save(self, *args, **kwargs): 
    if not self.first_name: 
     self.first_name = self.user.first_name 
    # now call the default save() method 
    super(MyModel, self).save(*args, **kwargs) 

這樣,你不不必改變你的數據庫,但它只在保存時刷新 - 所以如果相關的用戶對象被更改,但這個對象不是,它會引用舊的用戶值。

+0

您可以指定db_column ='first_name'來防止模式更改:http://docs.djangoproject.com/en/dev/ref/models/fields/#db-column – 2009-08-27 18:11:56

+0

所以在@ first_name.setter thingy只需添加first_name.db_column =「first_name」?我能做到:address = Address.objects.get(first_name =「blah」)? – pielgrzym 2009-08-27 18:18:32

+0

我已經更新了代碼和解釋以迴應piquadrat的評論。 – 2009-08-27 18:31:31