覆盖Django get_or_create

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了覆盖Django get_or_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函数只调用QuerySet.get_or_create函数。也许我可以写它来使用其他管理器功能而不是QuerySet版本的get_or_create?你们都在想什么?

答案

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

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

然后,您可以将自定义管理器添加到使用此自定义AccountQuerySet模型中:

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

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

class Account(models.Model):
    ...
    objects = AccountManager()

但你可能会发现try-except方法毕竟更整洁:)

以上是关于覆盖Django get_or_create的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 是不是与 Django 的 get_or_create 等效?

Django - SQL 批量 get_or_create 可能吗?

django - 使用 get_or_create 自动创建用户时设置用户权限

Django:有没有办法有效地批量 get_or_create()

使用 User.objects.get_or_create() 在 django 中给出无效的密码格式?

与 iexact 一起使用时,Django get_or_create 无法设置字段