Django генерирует поля модели из массива - PullRequest
1 голос
/ 10 февраля 2020

Мне нужно сгенерировать модель БД из массива строк, например:

strings = ['String 1', 'String 2', ..., 'String N-1', 'String N']

Мне нужна таблица в моей БД с этой формой

ORIGIN | STRING 1 | STRING 2 |...| STRING N
 char  |   char   |   char   |...| char

Я создал свою модель Класс вроде этого:

class FixedCharField(models.Field):
  def __init__(self, max_length, *args, **kwargs):
    self.max_length = max_length
    super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)

  def db_type(self):
    return 'char(%s)' % self.max_length


class MyModel(models.Model):
    strings = get_my_array() # aux function to generate the array
    origin = FixedCharField(max_length=3)
    for string in strings:
        string = FixedCharField(max_length=3)

Как видите, мне нужно, чтобы каждое имя столбца имело фиксированный размер 3, поэтому я использовал пользовательский FixedCharField, который я нашел по этой ссылке Fixed Char Field *

Мой вопрос, будет ли это работать? И это правильный подход для этого?

1 Ответ

2 голосов
/ 10 февраля 2020

Это не будет работать, поскольку здесь вы каждый раз перезаписываете переменную item, пока она не будет перезаписана в последний раз. Тогда это будет элемент, который Django «увидит» после инициализации класса.

Вы можете обновить словарь locals() в классе для этого:

class MyModel(models.Model):
    strings = get_my_array()
    for string in strings:
        <b>locals()[string]</b> = FixedCharField(max_length=3)

Но все-таки это выглядит очень некрасиво. Здесь может быть лучше внести ваши элементы в модель:

class MyModel(models.Model):
    # other fields
    pass

for string in get_my_array():
    FixedCharField(max_length=3)<b>.contribute_to_class(</b>MyModel, string<b>)</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...