【问题标题】:Django - Creating model fields from list with for loopDjango - 使用 for 循环从列表中创建模型字段
【发布时间】:2014-07-13 18:10:35
【问题描述】:

我有一个包含 100 个标签的长列表,我需要我的模型将其作为字段并在代码的其他部分中连续调用以访问它们。我将来需要修改它们,所以我希望能够在一个地方完成。有没有一种简单的方法可以做到这一点。例如:

labels = ['height', 'weight', 'age']

在models.py中

class MyModel(models.Model):
    for label in labels:
        label = models.CharField(max_length=255)

以上是否等于:

class MyModel(models.Model):
    height = models.CharField(max_length=255)
    weight = models.CharField(max_length=255)
    age = models.CharField(max_length=255)

【问题讨论】:

  • “在代码的其他部分也连续调用以访问它们”是什么意思?每个模型都有 100 个标签吗?标签多久更换一次?
  • 所以一个模型将有 100 个不同的字段,然后我希望能够调用所有这些字段。例如:[MyModel.field for field in labels]。
  • 不,该代码不等效。字符串(幸运的是)不会自动转换为符号

标签: python django


【解决方案1】:

Django 模型有一个add_to_class 方法,它可以将一个字段(或任何属性,实际上)添加到一个类中。语法为MyModel.add_to_class(name, value)。结果代码将是:

class MyModel(models.Model):
    pass

for label in labels:
    MyModel.add_to_class(label, models.CharField(max_length=255))

在内部,这将对传递的值调用contribute_to_class 方法,如果该方法存在的话。静态属性按原样添加到类中,但字段具有此方法,所有后续处理都会随之而来。

【讨论】:

  • 何时是调用 for 循环的最佳时间,而不是在模型类中?在models.py 文件中?这不会导致迁移出现一些问题吗?
  • @SimpleSyrup 就在模型定义之后。它不会导致 syncdb/migrations 出现问题,因为模型及其字段是在导入类后完全定义的。
  • 我明白了。由于 python 会查看整个文件。感谢您的提示。这解决了我的困境。
  • 如果模型类包含 20 多个属性,这是否被认为是最“Pythonic”的代码编写方式?
【解决方案2】:

使用locals() 应该在这里工作:

class MyModel(models.Model):
    for label in labels:
        locals()[label] = models.CharField(max_length=255)

    del locals()['label']

【讨论】:

  • 这就是python。使标签成为类的局部变量。对吗?
  • 糟糕,它实际上会作为MyClass.label 的属性公开。您需要在该循环之后添加 del locals()['label'] 以防止这种情况发生
  • 整个循环后还是循环中看不懂?我不希望它暴露,因为这是 django 默认的行为?还是它实际上会尝试从类中而不是从数据库中提取它?
  • 没有那个删除,MyModel.label == 'age',这对任何人都没有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多