2012-03-31 9 views
0

Ich habe ein Problem mit dem Aufruf einer property() innerhalb einer dynamic model in Django. Ich brauche ein zusätzliches Feld, das mir einen log-transformierten Wert eines vorhandenen Feldes einer Datenbanktabelle gibt. Zur weiteren Verarbeitung muss das Feld über die Modellstruktur zugänglich sein. Der Name der Datenbanktabelle wird zur Laufzeit definiert, so dass ich ein dynamisches Modell benötige.Wie kann man die Eigenschaftsmethode in einem dynamischen Django-Modell aufrufen?

Das ist meine Bestimmung des Modells:

def create_model(self, name, libs=None, app_label='gotool', module='', options=None, admin_opts=None): 
    fields = { 
     'database_id': models.CharField(max_length=255, primary_key=True), 
     'description': models.TextField(blank=True), 
     'l1_normalized': models.FloatField(null=True, blank=True), 
     'l2_normalized': models.FloatField(null=True, blank=True), 
     'pvalue': models.FloatField(null=True, blank=True), 
     'log2fc': models.FloatField(null=True, blank=True), 
     'goterm': models.TextField(db_column='GOTerm', blank=True), 
     '_get_l1_logcount': lambda self: numpy.log10(self.l1_normalized), 
     # here is my problem:  
     'l1_s_logcount': property(_get_l1_logcount), # I don't know how to call the property-method inside the dynamic model definition 
    } 

    class Meta: 
     pass 

    if app_label: 
     setattr(Meta, 'app_label', app_label) 

    if options is not None: 
     for key, value in options.iteritems(): 
      setattr(Meta, key, value) 

    attrs = {'__module__': module, 'Meta': Meta} 

    if fields: 
     attrs.update(fields) 

    model = type(name, (models.Model,), attrs) 

    if admin_opts is not None: 
     class Admin(admin.ModelAdmin): 
      pass 
     for key, value in admin_opts: 
      setattr(Admin, key, value) 
     admin.site.register(model, Admin) 

    return model 

Vielen Dank für Ihre Hilfe!

Antwort

1

Denken Sie an eine Art und Weise, in der Sie es in einer Klasse implementieren könnten:

class X(object): 
    def get_y(self): 
     return self.y 

Wenn Sie eine Eigenschaft y ohne tatsächlich mit der Funktion get_y, wie es an diesem Punkt steht zu schaffen fehlen, wie könnte man TU es?

class X(object): 
    def get_y(self): 
     return self.y 

    @property 
    def y(self): 
     return self.get_y() 

So wird es zur Laufzeit ausgewertet.

'l1_s_logcount': property(lambda self: self._get_l1_logcount()), 

Oder Ausschneiden der Zwischenschritt

'l1_s_logcount': property(lambda self: numpy.log10(self.l1_normalized)), 
0

Auch Sie könnten die Funktion herausnehmen und es verwenden, um direkt

get_l1_logcount = lambda self: numpy.log10(self.l1_normalized) 

fields = { 
    ..., 
    '_get_l1_logcount': get_l1_logcount,  
    'l1_s_logcount': property(get_l1_logcount), 
} 
Verwandte Themen