Джанго: определение поля динамической модели - PullRequest
0 голосов
/ 26 ноября 2011

Привет Stackoverflow люди,

У меня есть определение модели, которое является довольно монотонным, оно включает поля для ячеек от 1 до 50.

Для подтверждения концепции я написал это от руки, но должен быть лучший способ автоматизировать определение модели и сохранить код в хорошем и аккуратном состоянии.

Пока я сделал это следующим образом:

class Bins(models.Model):
    p1 = models.DecimalField(_('bin 1'), max_digits=6, decimal_places=2)
    p2 = models.DecimalField(_('bin 2'), max_digits=6, decimal_places=2)
    p3 = models.DecimalField(_('bin 3'), max_digits=6, decimal_places=2)
    ...
    p50 = ...

На Django wiki я нашел сводку для определений динамических моделей, но кажется, что в определении не допускаются циклы:

Я пробовал код ниже, но я получаю сообщение об ошибке, что MAX_BIN = 2 - неверный синтаксис. Я понимаю ошибку, которую не могу повторить по полю, как я пытался.

Bins = type('Bins', (models.Model,), {     
    MAX_BIN = 50
    for i in range(MAX_BIN):
        name_sects = ["p", str(i)]
        "".join(name_sects): model.DecimalField(_("".join([bin ', str(i)])),
                             max_digits=6, decimal_places=2)
    })

Возможно ли вообще такое динамическое определение класса? Если да, то как лучше определить класс?

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011

в вашей текущей редакции, ваш цикл находится внутри определения dict.это не разрешенотем не менее, вы можете определить свои поля в поле dict за пределами вашего звонка на type, который работает нормально.что-то вроде

attrs = {
    other_field = models.IntegerField(),
    '__module__': 'myapp.models',
}

MAX_BIN = 50
   for i in range(MAX_BIN):
       name_sects = ["p", str(i)]
        attrs["".join(name_sects)] = model.DecimalField(_("".join(['bin ', str(i)])),
            max_digits=6, decimal_places=2)

Bins = type('Bins', (models.Model,), attrs)
0 голосов
/ 25 июня 2012

Простое решение, которое решает ту же проблему:

class Bins(models.Model):
    MAX_BIN = 50
    for i in xrange(1, MAX_BIN + 1):
        vars()['p' + str(i)] = models.DecimalField('bin ' + str(i),
            max_digits=6, decimal_places=2)
...