Mam szereg modeli, które wyglądać tak:Tworzenie instancji modeli proxy Django ze swojej klasy bazowej
class Analysis(models.Model):
analysis_type = models.CharField(max_length=255)
def important_method(self):
...do stuff...
class SpecialAnalysis(Analysis):
class Meta:
proxy = True
def important_method(self):
...something different...
To wszystko jest dość standardowy. Jednak chciałbym automatycznie przekonwertować model Analysis
na model proxy na podstawie wartości pola analysis_type
. Na przykład chciałbym móc napisać kod wyglądający następująco:
>>> analysis = Analysis.objects.create(analysis_type="nothing_special")
>>> analysis.__class__
<class 'my_app.models.Analysis'>
>>> analysis = Analysis.objects.create(analysis_type="special")
>>> analysis.__class__
<class 'my_app.models.SpecialAnalysis'>
>>> analysis = Analysis.objects.get(pk=2)
>>> analysis.__class__
<class 'my_app.models.SpecialAnalysis'>
>>> # calls the ``important_method`` of the correct model
>>> for analysis in Analysis.objects.all():
... analysis.important_method()
Czy to jest nawet możliwe? Podobne pytanie zostało zadane here, które faktycznie podaje kod dla przykładu iteracji, ale nadal pozostawia mnie z pytaniem, jak uzyskać lub utworzyć instancję klasy proxy od jej rodzica. Przypuszczam, że mógłbym zastąpić kilka metod zarządzania, ale wydaje mi się, że musi to być bardziej elegancki sposób.
Cóż, jest to zdecydowanie czystsze niż szalone rzeczy, które próbowałem. Dzięki za pomoc! –
Twoja metoda raczej nie zawiedzie sama w sobie, ale ręczne mapowanie zdecydowanie nie skaluje się; przyszli goście mogliby być lepiej obsługiwani za pomocą metody .__ podklas __(), aby uzyskać listę modeli proxy i zapytać niektórych/wszystkich dynamicznie, w razie potrzeby. – Ivan