gpt4 book ai didi

python - 覆盖 Django get_or_create

转载 作者:太空狗 更新时间:2023-10-29 22:27:51 25 4
gpt4 key购买 nike

我有一个模型,我覆盖了 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_createQuerySet 版本?大家怎么看?

最佳答案

您可以子类化 django.db.models.query.QuerySet 并覆盖那里的 get_or_create 方法以接受您的 request 关键字参数并传递我想它会被保存到 save 上,但它不是很漂亮。

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

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

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

然后在你的模型中使用这个管理器:

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

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

关于python - 覆盖 Django get_or_create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5173343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com