2012-03-31 2 views
0

У меня проблема с вызовом property() внутри dynamic model в Django. Мне нужно дополнительное поле, которое дает мне преобразованное в лог значение существующего поля таблицы базы данных. Для дальнейшей обработки поле должно быть доступно через структуру модели. Имя таблицы базы данных будет определено во время выполнения, так что мне нужна динамическая модель.Как вызвать метод свойства в динамической модели 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 

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

ответ

1

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

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

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

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

fields = { 
    ..., 
    '_get_l1_logcount': get_l1_logcount,  
    'l1_s_logcount': property(get_l1_logcount), 
} 
Смежные вопросы