遍历 Django 模型中的字段 class

Loop through fields in Django model class

我试图消除我的 models.py 文件中的重复代码,但以下循环不起作用并且 returns "OperationalError no such column my_app.rank."

from django.db import models

rank_fields = [
    'E1', 'E2','E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9',
    'W1', 'W2', 'W3', 'W4', 'W5', 'O1E', 'O2E', 'O3E', 'O1',
    'O2', 'O3', 'O4', 'O5', 'O6', 'O7', 'O8', 'O9', 'O10'
]

class withDependents(models.Model):
    MHA = models.CharField(max_length = 5)
    for rank in rank_fields:
        rank = models.DecimalField(max_digits = 10, decimal_places = 2)

编辑:

我找到了一种可行的解决方案:

# add rank fields to withDependents and withOutDependents
rank_fields = [
    'E1', 'E2','E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9',
    'W1', 'W2', 'W3', 'W4', 'W5', 'O1E', 'O2E', 'O3E', 'O1',
    'O2', 'O3', 'O4', 'O5', 'O6', 'O7', 'O8', 'O9', 'O10'
    ]

for rank in rank_fields:
        withDependents.add_to_class(rank, models.DecimalField(max_digits = 10, decimal_places = 2))
        withOutDependents.add_to_class(rank, models.DecimalField(max_digits = 10, decimal_places = 2))

方法是在class_prepared上使用contribute_to_class字段方法:

from django.db.models import DecimalField
from django.db.models.signals import class_prepared

def add_fields(sender, **kwargs):
    if sender.__name__ == "withDependents":
        for rank in rank_fields:
            field = DecimalField(max_digits = 10, decimal_places = 2)
            field.contribute_to_class(sender, rank)

class_prepared.connect(add_fields)