Повторяющиеся поля в моделях django



Мне нужно сделать модель, которая имеет 15 подобных полей (назовем их field_01, field_02, field_03, и т.д.). Мне также нужно, чтобы эти поля были легко доступны (например, чтобы иметь возможность делать такие вещи, как obj.field_01). Потому что я хотел получить что-то от Земли очень быстро, я просто создал их глупым способом:



class M (models.Model):
....
field_01 = models.NullBooleanField()
field_02 = models.NullBooleanField()
....


Я искал в интернете лучший способ сделать это. Некоторые люди говорят использовать setattr, но, насколько я мог судить из чтения и пробы некоторых вещей, это добавляет атрибуты к экземпляр класса, а не сам класс, что означает, что когда я попытаюсь присоединить форму модели к этой модели, она не увидит полей, добавленных с помощью setattr. Затем я попытался переопределить __new__ функция, которая позволит мне добавить свойства к классу до того, как экземпляр этого класса будет создан. Но я не мог понять, как именно это сделать.



Итак, как можно генерировать эти поля, не нарушая Юг и модельные формы и не копипастя?

752   3  

3 ответов:

Трудно сказать определенно без конкретного примера того, что вы делаете, но обычно, если вы обнаруживаете, что повторяете поле, то это ясный знак для отношения один-ко-многим или много-ко-многим, вместо этого:

Один ко многим

class Field(models.Model):
    m = models.ForeignKey(M, related_name='fields')
    field = models.NullBooleanField()

Многие ко многим

class Field(models.Model):
    field = models.NullBooleanField()

class M(models.Model):
    fields = models.ManyToManyField(Field)

У моделей Django есть метод add_to_class, который вы можете (ab)использовать для моделей обезьян-патчей так, как вам хотелось бы.

for i in range(1, 10):
    M.add_to_class('field_%s' % s, NullBooleanField())

Похоже, вы хотите иметь базу данных стилей EAV. Вы должны попробовать библиотеку, а не катать свою собственную. С этой точки зрения, Django EAV выглядит довольно потрясающе. https://github.com/mvpdev/django-eav

Чтобы узнать больше о плюсах и минусах группы библиотек, чтобы выполнить эту проверку: https://stackoverflow.com/a/7934577/884453

Comments

    Ничего не найдено.