12

我有一个模型,我覆盖了该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函数只是调用了一个QuerySet.get_or_create函数。也许我可以编写它以使用其他管理器功能而QuerySet不是get_or_create? 大家觉得呢?

4

1 回答 1

17

您可以继承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方法毕竟更整洁:)

于 2011-03-03T00:40:29.130 回答