переопределение 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 метод аккуратнее, в конце концов :)