Próbuję znaleźć rzeczywistą klasę obiektu django-model, przy użyciu dziedziczenia modelu.Jak znaleźć "klasę betonu" modelu django bazowego
Niektóre kodu do opisania problemu:
class Base(models.model):
def basemethod(self):
...
class Child_1(Base):
pass
class Child_2(Base):
pass
Jeśli tworzę różne przedmioty o dwóch klasach dziecka i tworzenia queryset zawierających je wszystkie:
Child_1().save()
Child_2().save()
(o1, o2) = Base.objects.all()
Chcę ustalić, czy obiekt jest typu Child_1 lub Child_2 w metodzie base, mogę dostać się do obiektu podrzędnego przez o1.child_1 i o2.child_2, ale to zrewolucjonizuje wiedzę o klasach potomnych w klasie bazowej.
I mają pochodzić z następującego kodu:
def concrete_instance(self):
instance = None
for subclass in self._meta.get_all_related_objects():
acc_name = subclass.get_accessor_name()
try:
instance = self.__getattribute__(acc_name)
return instance
except Exception, e:
pass
Ale czuje się kruche i nie jestem pewien, co się dzieje, gdy jeśli dziedziczą w kilku poziomach.
Dzięki, że rozwiązałem mój problem –
Nie wiem, czy to dlatego, że jestem na Django 1.4, ale to nie działało dla mnie, dopóki nie użyłem 'if (nie self.content_type_id)' zamiast self.content_type. najwyraźniej Django próbował załadować self.content_type, co spowodowało 'DoesNotExist' –
AFAIK, dokładnie to robi ten pakiet: https://django-polymorphic.readthedocs.org/en/latest/ Zwraca konkretną klasę potomną, nawet jeśli używasz BaseClass.objects.filter() – guettli