Вы можете просто создать модель профиля пользователя с отношением OneToOne и запустить ее, используя сигнал всякий раз, когда пользователь был добавлен, не касаясь модели пользователя.
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
class Profile(models.Model):
user=models.OneToOneField(User, on_delete=models.CASCADE)
q1 = models.TextField()
q2 = models.TextField()
def __unicode__(self):
return self.user.q1
def create_profile(sender, **kwargs):
user = kwargs["instance"]
if kwargs["created"]:
user_profile = Profile(user=user)
user_profile.save()
post_save.connect(create_profile, sender=User)
Вы должны определить фабрику следующим образом:
public abstract class DAOFactory<DAO extends BaseDAO> {
public DAO getCustomerDAO();
public static <DAO extends BaseDAO> DAOFactory<DAO> getInstance(Class<DAO> typeToken){
// instantiate the the proper factory by using the typeToken.
if(system.getProperty("allowtest").equals("yes")) {
return new TestDAOFactory();
}
else return new ProdDAOFactory();
}
getInstance должен возвращать правильно типизированный DAOFactory.
Заводская переменная будет иметь тип:
DAOFactory<CustomerDAO> factory = DAOFactory<CustomerDAO>.getInstance(CustomerDAO.class);
, и использование будет правильно напечатано:
CustomerDAO dao = factory.getCustomerDAO();
dao.getCustomer();
единственная проблема, вероятно, будет заключаться в приведении типов внутри методов getInstance.
Ваш пример не демонстрирует необходимость в BaseDAO
, и нет причин, по которым DAOFactory. getCustomerDAO ()
не следует объявлять для возврата CustomerDAO
. Так что я не вижу там необходимости в дженериках. Однако учтите следующее:
interface DataAccess<T> {
void store(T entity);
T lookup(Serialiable identifier);
void delete(Serializable identifier);
Collection<? extends T> find(Criteria query);
}
abstract class DataAccessFactory {
abstract DataAccess<T> getDataAccess(Class<T> clz);
static DataAccessFactory getInstance() {
...
}
}
Я использовал что-то вроде этого подхода в нескольких проектах, и очень приятно написать один DAO, который работает для каждой сущности в модели. Слабость - это методы поиска. Есть несколько изящных подходов, и предстоящая работа в JPA заключается в стандартизации API «критериев», но на данный момент часто проще всего раскрыть критерии базового механизма устойчивости.
и очень приятно написать один DAO, который работает для каждой сущности в модели. Слабость - это методы поиска. Есть несколько изящных подходов, и предстоящая работа в JPA заключается в стандартизации API «критериев», но на данный момент часто проще всего раскрыть критерии базового механизма устойчивости. и очень приятно написать один DAO, который работает для каждой сущности в модели. Слабость - это методы поиска. Есть несколько изящных подходов, и предстоящая работа в JPA заключается в стандартизации API «критериев», но на данный момент часто проще всего раскрыть критерии базового механизма устойчивости.Существует множество статей, в которых подробно описывается, что вам нужно:
Обратите внимание, что, в отличие от вашего примера, нет причин, по которым методы DAOFactory
не должен возвращать фактические подклассы (например, CustomerDAO getCustomerDAO ()
). Кроме того, основным преимуществом использования общих DAO является наличие типа сущности «обобщенный», поэтому вам не нужно выполнять приведение из load () / get () / find ()
и аналогичных методов.
Когда я использовал фабрики, я обычно использовал instanceof для определения истинного типа объекта. Например:
CustomerDAO dao;
if (factory.getCustomerDAO() instanceof CustomerDAO) {
dao = factory.getCustomerDAO();
}
dao.getCustomer();
Мне это кажется более понятным, особенно если factory.getCustomerDAO () не возвращает ничего близкого к CustomerDAO (из-за изменений в реализации).
Только мои два цента.