2012-06-01 18 views
0

我想設計一個包含字段的抽象模型。子模型將具有此字段,但它們將具有各種字段類型。類似django模型行爲的接口 - 重寫models.Field

class AbsModel(models.Model): 
    data = models.??? #I want subclasses to choose this 

    def __unicode__(self): 
     return data.__str__() 

    class Meta: 
     abstract = True 

class TimeModel(AbsModel): 
    data = models.TimeField() 
    ... 

class CharModel(AbsModel): 
    data = models.CharField(...) 
    ... 

我正在尋找一種方式來強制實現數據場的存在,所以我可以寫的Unicode一次的所有對象。

如果這是不可能的,怎麼能調用父類的Unicode時我指的是子類的「數據」字段

我有一種感覺,這第二個問題,有一個明顯的答案我失蹤。

回答

0

無法重寫字段類型爲models.Field的超類字段。

https://docs.djangoproject.com/en/1.4/topics/db/models/#field-name-hiding-is-not-permitted

您可以通過定義另一種類型的字段在父類,然後重寫它在孩子避開這個(也許包括__str__()方法,以防萬一數據字段未覆蓋)。

from django.db import models 


class AbsDataField: 
    def __str__(self): 
     return "undefined" 

class AbsModel(models.Model): 
    data = AbsDataField 

    def __unicode__(self): 
     return self.data.__str__() 

    class Meta: 
     abstract = True 

class TimeModel(AbsModel): 
    data = models.TimeField() 
    #... 

class CharModel(AbsModel): 
    data = models.CharField(max_length=32) 
    #... 
0

你可以寫這樣的事情:

class AbsModel(models.Model): 
    def __unicode__(self): 
     if hasattr(self, "data") and isinstance(self.data, models.Field): 
      return data.__str__() 
     return u"Unknown" 
0

cannot do that in Django

在普通的Python類繼承,允許一個孩子 類重寫父類的任何屬性。在Django中, 不允許用於Field實例的屬性(至少 此刻不是)。如果某個基類有一個名爲author的字段,那麼 不能在任何類中創建另一個稱爲author的模型字段,該字段從該基類繼承。

在父模型中覆蓋字段會導致在區域 (例如初始化新實例(指定哪個字段在Model.__init__中被初始化)和序列化)中的困難。這些功能 正常的Python類繼承不必在 處理相同的方式,所以Django模型繼承 和Python類繼承之間的區別並不是任意的。

[...]

Django會提出一個FieldError如果你在任何 祖先模型覆蓋任何模式場。