[英]override 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
函数。 也许我可以编写它来使用其他管理器函数而不是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(...):
...
然后,您可以将自定义管理器添加到使用此自定义QuerySet
Account
模型中:
class AccountManager(models.Manager):
def get_queryset(self):
return AccountQuerySet(self.model)
然后在您的模型中使用此管理器:
class Account(models.Model):
...
objects = AccountManager()
但你可能会发现try-except
方法毕竟更整洁:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.