ho una serie di modelli che assomigliano a questo:Creazione di istanze di modelli del proxy Django dalla loro classe di base
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...
Tutto questo è abbastanza standard. Tuttavia, ciò che mi piacerebbe fare è convertire automaticamente un modello in un modello proxy basato sul valore del campo analysis_type
. Ad esempio, mi piacerebbe essere in grado di scrivere codice che assomiglia a questo:
>>> 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()
È questo anche lontanamente possibile? Una domanda simile è stata posta a here, che in realtà fornisce un codice per l'esempio di iterazione, ma mi lascia ancora la domanda su come ottenere o creare un'istanza di una classe proxy dal suo genitore. Suppongo che potrei semplicemente scavalcare un gruppo di metodi manager, ma sento che ci deve essere un modo più elegante per farlo.
Beh, questo è decisamente più pulito delle cose pazze che stavo provando. Grazie per l'aiuto! –
È improbabile che il tuo metodo fallisca di per sé, ma la mappatura manuale non ha una buona scalabilità; i visitatori futuri sarebbero meglio serviti usando il metodo Model .__ subclasses __() per ottenere l'elenco dei modelli proxy e interrogandone alcuni/tutti in modo dinamico secondo necessità. – Ivan