Как вызвать метод свойства в динамической модели Джанго? - PullRequest
1 голос
/ 31 марта 2012

У меня проблема с вызовом property() внутри динамической модели в Django.Мне нужно дополнительное поле, которое дает мне преобразованное в журнал значение существующего поля таблицы базы данных.Для дальнейшей обработки поле должно быть доступно через структуру модели.Имя таблицы базы данных будет определено во время выполнения, поэтому мне нужна динамическая модель.

Это определение моей модели:

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

Большое спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Подумайте, как вы могли бы реализовать его в классе:

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

Если вы хотели создать свойство y без фактического использования функции get_y в том виде, в каком она естьточка, как вы могли бы это сделать?

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

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

Таким образом, он оценивается во время выполнения.

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

Или, вырезая промежуточный шаг,

'l1_s_logcount': property(lambda self: numpy.log10(self.l1_normalized)),
0 голосов
/ 31 марта 2012

Также вы можете вынуть функцию и использовать ее напрямую

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

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