Когда делая выборку из объекта родителя и хочется получать объекты наследники, то я использую такой финт
-
from django.db import models
-
-
class MBase(models.Model):
-
field1 = models.CharField(max_length=10)
-
field2 = models.CharField(max_length=10)
-
classname = models.CharField(max_length=10)
-
def save(self,*args,**kwargs):
-
self.classname = self.__class__.__name__.lower()
-
super(MBase,self).save(*args,**kwargs)
-
@property
-
def rel_obj(self):
-
return getattr(self, self.classname)
-
-
class MFirst(MBase):
-
myf1 = models.CharField(max_length=10)
-
-
class MSecond(MBase):
-
myf2 = models.CharField(max_length=10)
А в коде выходит примерно следующее
-
In [11]: M.MBase.objects.get(id=3)
-
Out[11]: <MBase: MBase object>
-
-
In [12]: M.MBase.objects.get(id=3).rel_obj
-
Out[12]: <MFirst: MFirst object>
-
-
In [13]: M.MBase.objects.get(id=3).rel_obj.myf1
-
Out[13]: u'Hi1'
PS: Чтоб не мучаться, можно вынести функционал в абстрактную модель.
-
class RelatedBase(models.Model):
-
childclassname = models.CharField(max_length=20,editable=False)
-
def save(self,*args,**kwargs):
-
if not self.childclassname:
-
self.childclassname = self.__class__.__name__.lower()
-
super(RelatedBase,self).save(*args,**kwargs)
-
@property
-
def rel_obj(self):
-
return getattr(self, self.childclassname)
-
class Meta:
-
abstract=True
а все базовые классы уже будут от нее наследоваться
[?]




