gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:39:26 24 4
gpt4 key购买 nike

我想动态设置模型的属性。这是我的做法。

# 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com