(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