Наследование модели в django-nonrel на движке приложения - PullRequest
4 голосов
/ 02 марта 2011

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

Есть ли способ дублировать это с использованием моделей django-nonrel? Кажется, что простое наследование модели не сработает, поскольку django-nonrel требует, чтобы базовый класс был абстрактным. Я ошибаюсь или есть другой способ добиться того же эффекта, о котором я не знаю?

Редактировать: Одна из возможных причин, с которой я сталкиваюсь, заключается в том, чтобы пойти дальше и использовать обычное наследование модели django, установить базовый класс цели для абстрагирования по мере необходимости и создать подмодели, а затем вместо попытки запрашивать объекты цели, создавая модель для каждого пользователя с ListField, которая содержит ссылки на различные сущности подкласса и извлекает ListField. Это похоже на работоспособную альтернативу?

1 Ответ

0 голосов
/ 02 апреля 2014

Вы можете использовать ListField в djangotoolbox , это расширит django-nonrel новым полем типа ListField, это как поле типа «один ко многим» в Django, которое выМожно сохранить все дочерние объекты в поле с помощью ListProperty.

Существует полезная документация по инструкции ListField: http://django -mongodb-engine.readthedocs.org / en / latest / themes / lists-and-dicts.html

Модель

from djangotoolbox.fields import ListField

class Post(models.Model):
    ...
    tags = ListField()

Использование

>>> Post(tags=['django', 'mongodb'], ...).save()
>>> Post.objecs.get(...).tags
['django', 'mongodb']

Уведомление

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

...