覆盖Django get_or_create

时间:2011-03-02 20:56:17

标签: python django django-models subclass django-managers

我有一个模型,我覆盖了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,但我想知道是否有办法覆盖{{1}什么是正确的方法

我查看了get_or_create的代码(我正在考虑覆盖),而Manager函数只调用get_or_create函数。也许我可以编写它来使用其他管理器功能而不是QuerySet.get_or_create QuerySet版本的get_or_create? 你们都在想什么?

1 个答案:

答案 0 :(得分:8)

您可以继承django.db.models.query.QuerySet并覆盖get_or_create方法以接受您的request关键字参数并将其传递到save我猜,但它不是很漂亮

class AccountQuerySet(models.query.QuerySet):
    def get_or_create(...):
        ...

然后,您可以向使用此自定义Account的{​​{1}}模型添加自定义管理器:

QuerySet

然后在您的模型中使用此管理器:

class AccountManager(models.Manager):
    def get_queryset(self):
        return AccountQuerySet(self.model)

但是你可能会发现class Account(models.Model): ... objects = AccountManager() 方法更加整洁:)