переопределение Django get или create
у меня есть модель, которую я преодолел save
метод, так что save
метод может быть передан в некоторые данные и автоматическое заполнение поля перед сохранением. Вот моя модель:
class AccountModel(models.Model):
account = models.ForeignKey(Account)
def save(self, request=None, *args, **kwargs):
if request:
self.account = request.session['account']
super(AccountModel, self).save(*args, **kwargs)
class Meta:
abstract = True
идея в том, что я настраиваю базовую модель для объектов, которые должны быть связаны с учетной записью, а затем мне не придется иметь дело с подключениями к учетной записи каждый раз, когда они появляются (что много).
но: я также хотел бы использовать get_or_create
, который сохраняет новые объекты без передаю просьбу. Я знаю, что это выполнимо, чтобы не использовать get_or_create
и try
/except
вместо этого, но я хотел бы знать если есть способ, чтобы переопределить get_or_create
и как это правильно сделать.
Я посмотрел на код Manager
(который я смотрю на переопределение) и get_or_create
функция просто вызывает
1 ответов
вы могли бы подкласс django.db.models.query.QuerySet
и переопределить get_or_create
метод там, чтобы принять ваш request
аргумент ключевого слова и передать его на save
Я думаю, но это не очень красиво.
class AccountQuerySet(models.query.QuerySet):
def get_or_create(...):
...
затем вы можете добавить пользовательский менеджер в свой Account
модель, которая использует этот обычай QuerySet
:
class AccountManager(models.Manager):
def get_queryset(self):
return AccountQuerySet(self.model)
затем используйте этот менеджер в своей модели:
class Account(models.Model):
...
objects = AccountManager()
но вы можете обнаружить, что try-except
метод аккуратнее, в конце концов :)