Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在动态Django模型中调用property方法?_Python_Django_Django Models - Fatal编程技术网

Python 如何在动态Django模型中调用property方法?

Python 如何在动态Django模型中调用property方法?,python,django,django-models,Python,Django,Django Models,在Django中调用内部的property()时遇到问题。我需要一个额外的字段,它为我提供数据库表的现有字段的日志转换值。为了进一步处理,必须通过模型结构访问该字段。数据库表的名称将在运行时定义,因此我需要一个动态模型 这是我的模型定义: def create_model(self, name, libs=None, app_label='gotool', module='', options=None, admin_opts=None): fields = { 'dat

在Django中调用内部的
property()
时遇到问题。我需要一个额外的字段,它为我提供数据库表的现有字段的日志转换值。为了进一步处理,必须通过模型结构访问该字段。数据库表的名称将在运行时定义,因此我需要一个动态模型

这是我的模型定义:

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

非常感谢你的帮助

考虑一种在类中实现它的方法:

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)),

您也可以取出该函数并直接使用它

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

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