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,它自己解决这个特殊情况的方法