2015-04-22 2 views
0

Я пытаюсь устранить дубликат кода в файле models.py, но следующий цикл не работает и возвращает «OperationalError no такой столбец my_app.rank».Прокрутить поля в классе модели Django

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) 

Edit:

Я нашел одно возможное решение, которое работает:

# 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)) 
+0

Если эти поля не» чтобы удостовериться, что у них есть собственные определения полей, почему они не помещаются в отдельную таблицу? –

+3

Что именно вы пытаетесь достичь? В вашем первом фрагменте кода вы занимаете первое место каждый раз, когда петли forloop. – vishen

+0

@vishen, наконец, я смог отправить ответ. Я специализируюсь на [непонятных вопросах] (http://stackoverflow.com/questions/16991724/postgres-having-group-by-min-of-date-time-and-status);) – danihp

ответ

0

Способ заключается в использовании contribute_to_class метод поля на class_prepared:

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) 
Смежные вопросы