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