Я вынес общие атрибуты из двух классов в абстрактный базовый класс, однако у меня есть другая модель, которая должна ссылаться на любой из этих классов. Невозможно сослаться на ABC, поскольку на самом деле у него нет таблицы базы данных.
Следующий пример должен проиллюстрировать мою проблему:
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 и Answer_B немного отличаются тем, что Answer_A также требует отношения FK к другой таблице. Answer_B может также потребовать некоторые специфические атрибуты позже. Проблема все еще существовала бы, если бы у меня был Answer_B в качестве суперкласса - и имел бы подкласс Answer_A или составил бы его.
«Риск» один и тот же, будь то Ответ_A или Ответ_B. У меня также есть другие модели, которые должны ссылаться на «Ответ» независимо от его подтипа. Как это может быть сделано? Как вы можете ссылаться на тип независимо от его подтипа?
Обновление:
Я пытался избежать операции соединения, но не думаю, что смогу. Стоит ли иметь ссылку на «Резидент» во всех «Ответах» и просто обнулять ее там, где это необходимо? Или это считается очень плохой практикой?