Уникальные объекты DRY в Django

Постоянное Поколение. Детали являются, конечно, конкретной реализацией.

Кратко, это содержит объекты Java, связанные с классами и интернированными строками. В клиентской реализации Sun с совместным использованием на, classes.jsa с отображенной памятью для формирования исходных данных, с приблизительно наполовину только для чтения и половина копии на записи.

объекты Java, которые просто стары, сохранены в Штатном Поколении.

5
задан sampablokuper 7 September 2009 в 13:31
поделиться

1 ответ

Рефакторинг моделей - довольно дорогая вещь:

  • Вам нужно будет изменить весь код, использующий ваши модели, поскольку имена полей соответствуют свойствам объекта
  • Вам придется изменить вашу базу данных вручную, поскольку Django не может сделать это за вас (по крайней мере, та версия, которую я использовал в последний раз, когда работал с Django, не могла)

Поэтому я думаю, что обновление списка уникальных имен полей в мета-классе модели - наименьшая проблема для вас. о чем следует беспокоиться.

ИЗМЕНИТЬ : Если вы действительно хотите сделать это и все ваши поля должны быть «уникальными вместе», то человек в freenode прав, и вам придется написать собственный метакласс. Это довольно сложно и подвержено ошибкам, а также может сделать ваш код несовместимым с будущими выпусками Django.

«Магия» Django ORM управляется метаклассом ModelBase ( django.db.models.base.ModelBase ) универсального базового класса Model . Этот класс отвечает за то, чтобы взять определение вашего класса со всеми полями и метаинформацией и создать класс, который вы будете использовать в своем коде позже.

Вот рецепт того, как вы могли бы достичь своей цели:

  1. Подкласс ModelBase для использования вашего собственного метакласса.
  2. Переопределите метод __ new __ (cls, name, base, dict)
  3. Проверьте dict , чтобы собрать Meta member ( dict ["Meta"] ), а также все элементы поля
  4. Установите meta.unique_to together на основе имен собранных вами полей.
  5. Вызовите super реализация ( ModelBase. __new __ )
  6. Используйте настраиваемый метакласс для всех ваших уникальных моделей с помощью магического члена __ metaclass__ = MyMetaclass (или создайте абстрактный базовый класс, расширяющий Модель и переопределяющий метакласс)
4
ответ дан 15 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: