作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想动态设置模型的属性。这是我的做法。
# 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 descriptors ,而不是属性。这是因为导入模块和 Python 类和描述符放在一起时的事件顺序。
当然,你仍然可以使用Python这样的 super 动态语言来做到这一点。但问题的解决需要不同的方法
您可以使用Python metaclasses并覆盖__new__
参见declared_ SQLAlchemy中的attr,有自己的方式来解决这种特殊情况
关于python - 如何在 Django 模型中动态设置类的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31066919/
我是一名优秀的程序员,十分优秀!