He descompuesto los atributos comunes de dos clases en una clase base abstracta; sin embargo, tengo otro modelo que necesita hacer referencia a una de esas clases. No es posible hacer referencia a un ABC, ya que en realidad no tiene una tabla de base de datos.Configuración de una clave externa a una clase base abstracta con Django
El siguiente ejemplo debe ilustrar mi problema:
class Answer(models.Model):
ovramt = models.ForeignKey("Ovramt")
question = models.ForeignKey("Question")
answer = models.CharField(max_length=3, choices=(("yes","yes"),("no","no") ("NA","N/A"))
likelihood = models.IntegerField(choices=LIKELY_CHOICES)
consequence = models.IntegerField(choices=CONSEQUENCE_CHOICES)
class Meta:
abstract = True
class Answer_A(Answer):
resident = models.ForeignKey("Resident")
def __unicode__(self):
return u"%s - %s - %s" %(self.ovramt.ssa.name, self.resident, self.question)
class Answer_B(Answer):
def __unicode__(self):
return u"%s - %s" %(self.ovramt.ssa.name, self.question)
class Answer_Risk(models.Model):
answer = models.ForeignKey("Answer")
risk = models.CharField(max_length=200)
def __unicode__(self):
return self.risk
Answer_A y Answer_B son ligeramente diferentes en que Answer_A también necesita una relación FK a otra mesa. Answer_B también puede requerir algunos atributos específicos más adelante. El problema TODAVÍA existiría si tuviera Answer_B sea la superclase, y tenga Answer_A subclase o compórtala.
Un 'Riesgo' es el mismo ya sea Answer_A o Answer_B. También tengo otros modelos que necesitan hacer referencia a una "Respuesta" independientemente de su subtipo. ¿Cómo puede hacerse esto? ¿Cómo se puede hacer referencia a un tipo independientemente de su subtipo?
Actualización:
Estaba tratando de evitar una operación de unión, pero no creo que pueda hacerlo. ¿Valdría la pena tener la referencia a "Residente" en todas las "respuestas" y simplemente anularla cuando sea necesario? ¿O eso se considera una mala práctica?
Gracias por las sugerencias, pero las respuestas tendrán riesgos 1.M así como las soluciones 1..M, por lo que se requiere la tabla. Voy a ir con la configuración de residente a Ninguno cuando sea necesario, ya que parece ser la única diferencia entre los modelos. Si necesita cambiar más tarde lo haré entonces. –
El enlace de relación genérica ya no es válido, para la última versión de desarrollo, vaya aquí: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations –
Gracias @HermanSchaaf, tengo actualizado el enlace. – muhuk