(Django的1.x中,巨蟒的2.6.x)Django管理界面不會使用子類的__unicode __()
我有模型的調整:我沒有實例化動物
class Animal(models.Model):
pass
class Cat(Animal):
def __unicode__(self):
return "This is a cat"
class Dog(Animal):
def __unicode__(self):
return "This is a dog"
class AnimalHome(models.Model):
animal = models.ForeignKey(Animal)
,因爲這應該是一個虛擬的類。我已經實例化貓和狗,但在AnimalHome的管理頁面中,我選擇的動物顯示爲「動物對象」(我猜是默認的__unicode __()),而不是我爲這兩個子類定義的__unicode__。幫幫我。
抽象基類問題是一個紅鯡魚WRT對這個問題,我想。即使Animal不應該是抽象的,但我仍然有這樣的問題:出於某種原因,由於ForeignKey是在Animal上定義的,而不是它的一個子類,所以超類方法被調用而不是子類。在調用object.method()時,在OO編程中,您應該獲得最低子類的實現,並且您必須做額外的工作才能獲得任何超類的實現。那麼爲什麼在子類上定義__unicode__是不夠的 - 實際上問題可能是__unicode__根本沒有被調用,因爲內省對Animal類的反映顯示它沒有被定義。所以也許如果我爲Animal定義__unicode__並讓它調用子類'__unicode__我可以得到想要的效果。
好吧,我認爲我理解ORM問題。這兩個答案幫助我理解了這一點,謝謝。在實驗中,我發現當Django保存一個子類模型時,它會做兩件事:(1)它爲超類表中的子類對象創建一行;(2)它使得子類表中的PK與在超類表中分配的PK。子類表中的這個PK被命名爲superclass_ptr。基於此,我編制了以下內容。我會很感激反饋。
Class Animal(models.Model)
def __unicode__(self):
if Dog.objects.filter(pk=self.pk).count() > 0:
return unicode(Dog.objects.get(pk=self.pk))
elif Cat.objects.filter(pk=self.pk).count() > 0:
return unicode(Cat.objects.get(pk=self.pk))
else:
return "An Animal!"
看來,勞倫斯是最上點WRT這個問題。貓和狗將擁有不相交的PK集(動物的任何子類都將擁有與其超類記錄相同的PK),但不幸的是Django並沒有在幕後執行任何工作:「我是一隻動物,我知道動物有狗和貓的亞類,具體來說,我是動物3號,而且我只查了一下,也有貓3號,這意味着我實際上是貓3號。儘管這看起來完全可能並且非常合理(因爲貓不會做任何動物本身無法做到的事情),因爲它使用Python的內省。謝謝你們。
我不認爲你應該這樣編碼一個Django模型。嘗試以這樣一種方式定義數據模型,即可以爲所有動物使用一個表(即一個模型)。不要把決定因素放在你的代碼中。 如果你把你的對象醃成一個數據庫行,那麼你得到的東西像一個對象存儲。 – Ber 2008-11-24 07:44:21