Повторяющиеся поля в моделях 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__ функция, которая позволит мне добавить свойства к классу до того, как экземпляр этого класса будет создан. Но я не мог понять, как именно это сделать.
Итак, как можно генерировать эти поля, не нарушая Юг и модельные формы и не копипастя?
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