Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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的模型中动态设置类的属性?_Python_Django - Fatal编程技术网

Python 如何在Django的模型中动态设置类的属性?

Python 如何在Django的模型中动态设置类的属性?,python,django,Python,Django,我想动态地设置模型的属性。我就是这样做的 # models.py class pwr(models.Model): # test info tester = models.CharField(max_length=10) test_date = models.DateField(verbose_name='Test Date') test_summary = models.TextField(verbose_name='Test Summary')

我想动态地设置模型的属性。我就是这样做的

# models.py
class pwr(models.Model):



    # test info
    tester = models.CharField(max_length=10)
    test_date = models.DateField(verbose_name='Test Date')
    test_summary = models.TextField(verbose_name='Test Summary')
    test_duration = models.CharField(max_length=20, verbose_name='Test Duration')


    for i in xrange(2):
        ii = str(i)



        test_result = 'test_result_' + ii
        test_com = 'test_comment_' + ii
        bug_level = 'bug_level_' + ii
        bug_id = 'bug_id_' + ii
        bug_sum = 'bug_summary_' + ii
        exec (test_result + "= models.CharField(max_length=20, verbose_name='Result', \
        choices=(\
        ('Pass', 'P'), \
        ('Fail', 'F'), \
        ('Not Test', 'N/T'), \
        ('Not Avaliable', 'N/A'), \
        ('Reference', 'Ref'), \
        ('Warn', 'W')\
        ))")
        exec (test_com + "= models.CharField(max_length=100,  verbose_name='Comment',  blank=True)")
        exec (bug_level + "= models.CharField(max_length=100,  verbose_name='Bug Level',  blank=True, \
                            choices=(('1', '1:Blocker'), \
                            ('2', '2:Critical'), \
                            ('3', '3:Major'), \
                            ('4', '4:Normal'), \
                            ('5', '5:Enhancement')))")
        exec (bug_id + "= models.CharField(max_length=10,  verbose_name='Bug ID',  blank=True)")
        exec (bug_sum + "= models.CharField(max_length=100,  verbose_name='Bug Summary',  blank=True)")

# When I tried to use setattr here, no 'test_attribute' field is added to table pwr in database        
setattr(pwr, 'test_attribute', models.CharField(max_length=10,  verbose_name='test attr',  blank=True))    

这看起来真的很难看。。你有更好的解决办法吗?谢谢

您不能使用
setattr
动态设置它,因为您处理的是Python,而不是属性。这是因为导入模块时事件的顺序以及Python类ans描述符的组合

当然,您仍然可以使用像Python这样的高级动态语言来实现这一点。但问题的解决需要不同的方法

  • 您可以使用Python并覆盖
    \uuuuuu new\uuuuu

  • 请参阅SQLAlchemy中的attr,它自己解决这个特殊情况的方法


你在找。@BrenBarn是的,我试过使用setattr。但在这种情况下,它似乎不起作用。在类定义之后使用它不起作用。然后请发布一个小的、自包含的示例,说明您是如何尝试这样做的以及它是如何失败的。相关:@BrenBarn请检查代码中的我的更新。是的,我想我可以使用元类来解决此问题。谢谢