La interfaz de administración de Django no utiliza __unicode __ () de la subclase

(Django 1.x, Python 2.6.x)

Tengo modelos a tono de:

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)

No he instanciado ningún animal, porque se supone que es una clase virtual. He creado instancias de gatos y perros, pero en la página de administración de AnimalHome, mis opciones para animales se muestran como "objeto animal" (el __unicode __ () predeterminado), en oposición al __unicode__ que he definido para las dos subclases. Ayuda.

El tema abstracto de la clase base es una pista falsa para esta pregunta, creo. Incluso si se suponía que Animal no era abstracto, todavía tengo el problema de que, por alguna razón, dado que ForeignKey se define en Animal y no en una de sus subclases, se llama al método de superclase en lugar de la subclase. En la programación OO cuando llama a object.method () se supone que debe obtener la implementación de la subclase más baja, y debe hacer un trabajo adicional para obtener la implementación de cualquier superclase. Entonces, ¿por qué es que tener __unicode__ definido en las subclases no es suficiente para --- en realidad el problema podría ser que no se llame a __unicode__ porque la introspección en la clase Animal revela que no está definido. Entonces, tal vez si defino __unicode__ para Animal y hago que llame a las subclases '__unicode__, podría obtener el efecto deseado.

Bien, creo que entiendo los problemas de ORM. Ambas respuestas me han ayudado a entender esto, gracias. Mientras experimentaba con esto, descubrí que cuando Django guarda un modelo subclasificado, hace dos cosas: (1) crea una fila para el objeto subclasificado en la tabla de la superclase, y (2) hace que el PK en la tabla de subclase sea idéntico a El PK asignado en la tabla de superclase. Este PK en la tabla de subclase se llama superclass_ptr. Basado en esto, he inventado lo siguiente. Agradecería comentarios.

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!"

Parece que Lawrence está más acertado con esta pregunta. Cat and Dog tendrá conjuntos de PK disjuntos (y cualquier subclase de Animal tendrá un PK idéntico al registro de su superclase), pero desafortunadamente Django no realiza ningún trabajo detrás de escena: "Soy un animal. Lo sé Los animales tienen subclases Perro y Gato. Específicamente, soy el Animal número 3, y además lo acabo de comprobar y también hay un Gato número 3. Eso significa que en realidad soy el Gato número 3 ". Aunque esto parece completamente posible y muy razonable (ya que un Gato no hará nada que un Animal no pueda hacer por sí mismo) utilizando la introspección de Python. Gracias a todos.

Respuestas a la pregunta(6)

Su respuesta a la pregunta