@summerwind
Web-программист

Модели в Django без таблиц в базе данных?

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



В архитектуре MVC модель предназначена для хранения данных какой-либо сущности из предметной области и для размещения бизнес-логики, применяемой к этим данным. По сути, данные это не обязательно строки таблиц БД. Они могут храниться и в xml, txt-файлах, могут получаться через методы api удаленного сервиса.



Но в django модели почему-то завязаны конкретно на базу данных. То есть, нету какого-то более базового класса модели (или я о нём не знаю), который имел бы возможность валидации, возможность создания форм на основе него и т.д., но при этом не был бы жестко завязан на БД.



В моем случае приложение не хранит данные в БД, а получает всё через api удаленного soap-сервиса. Все сущности, включая и пользователей, получаются и сохраняются путем вызова методов api. Поэтому я был в некоторой растерянности, как же правильно поступить. В итоге я взял django 1.5, т.к. в раних версиях вообще невозможно создать собственную модель пользователя. И реализовал такое решение:



1. Создал свою модель пользователя, указав её в настройке AUTH_USER_MODEL, у модели определил managed = False и переопределил метод save:



from django.contrib.auth.models import AbstractBaseUser<br>
from django.db import models<br><br>
class User(AbstractBaseUser):<br>
    username = models.CharField(max_length=255, primary_key=True)<br>
    USERNAME_FIELD = 'username'<br><br>
    class Meta:<br>
        managed = False<br><br>
    def save(self, **kwargs):<br>
        # ...<br>
        # код сохранения модели через вызов api<br>
        # ... <br>


2. Написал свой класс бэкенда аутентификации, который работает через api soap-сервиса и указал только его в настройке AUTHENTICATION_BACKENDS.



3. Для остальных моделей по аналогии с моделью User определил managed = False и переопределил метод save.



Но почему-то какое-то ощущение, что я делаю костыль. Какое решение вы бы предложили в этой ситуации?
  • Вопрос задан
  • 5325 просмотров
Пригласить эксперта
Ответы на вопрос 1
muzhig
@muzhig
Думаю, БД — это не обязательно SQL. XML и plaintext file тоже можно рассматривать как базу данных. БД — это, как я думаю, просто хранилище сериализованных объектов модели. Вы всегда можете сделать свой database backend который будет сохранять объекты в SOAP и отправлять куда надо.

PS: думаю можно присмотреться к django.db.backends.dummy.base.DatabaseWrapper
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы