我想动态设置属性到模型。这是我做的方式。
# 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))
这看起来真的很难看。你有更好的解决方案吗?感谢!!!
答案 0 :(得分:2)
您无法使用setattr
动态设置它,因为您正在处理Python descriptors,而不是属性。这是因为导入模块时的事件顺序和Python类和描述符放在一起。
当然,您仍然可以使用Python等高级动态语言来完成此操作。但问题的解决方案需要不同的方法
您可以使用Python metaclasses并覆盖__new__
请参阅SQLAlchemy中的declared_ attr,解决此特例的方法