【问题标题】:How to dynamically set attributes to a class in models in Django?如何在Django的模型中动态设置类的属性?
【发布时间】:2015-06-26 07:01:54
【问题描述】:

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

# 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
  • @BrenBarn 是的,我已经尝试过使用 setattr。但在这种情况下似乎不起作用。在类定义后使用它不起作用。
  • 那么请发布一个小的、独立的示例,展示您如何尝试这样做以及它是如何失败的。
  • @BrenBarn 请检查我在代码中的更新。

标签: python django


【解决方案1】:

您不能使用setattr 动态设置它,因为您处理的是Python descriptors,而不是属性。这是因为导入模块和 Python 类和描述符放在一起时的事件顺序。

当然,您仍然可以使用 Python 等超级动态语言来执行此操作。但问题的解决方案需要不同的方法

  • 您可以使用 Python metaclasses 并覆盖 __new__

  • 参见 SQLAlchemy 中的 declared_attr,它自己解决这种特殊情况的方法

【讨论】:

  • 是的,我想我可以使用元类来解决这个问题。谢谢!
猜你喜欢
  • 2018-12-06
  • 2012-10-23
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多