gpt4 book ai didi

python - 在模型上的 save() 覆盖期间查询中没有匹配的对象 - 抛出DoesNotExist错误

转载 作者:行者123 更新时间:2023-12-01 07:41:22 24 4
gpt4 key购买 nike

我正在重写我的模型 save() 以检查并查看输入的电子邮件是否已存在消费者(相关对象)。当消费者确实存在且具有匹配的电子邮件时,代码将按预期执行并将案例关联到正确的消费者。但是,如果不存在具有匹配电子邮件的现有消费者,我会收到错误:“DoesNotExist:消费者匹配查询不存在。”

我尝试过调整 save() 方法,但对我来说它看起来是正确的(显然,这里可能是错误的)。

模型.py

class Case(models.Model):
...

def save(self,*args,**kwargs):

if Consumer.objects.get(email__iexact=self.email):
self.consumer = Consumer.objects.get(email__iexact=self.email)

else:
consumer = Consumer(first_name=self.first_name,last_name=self.last_name,email=self.email)
consumer.save()

return super().save(*args,**kwargs)

预期结果是在案例中输入的电子邮件与现有消费者的电子邮件不匹配的情况下创建一个新的消费者对象。相反,它会抛出此错误。

最佳答案

问题是你的:

if Consumer.objects.<b>get(</b>email__iexact=self.email<b>)</b>:
# ...

如果不存在这样的 Consumer 对象,或者存在多个这样的对象,则会引发错误。

但是,您可以仅检查是否不存在此类对象,如果缺少则创建一个,使用单个 .get_or_create(..) [Django-doc]调用:

def save(self,*args,**kwargs):
self.consumer, __ = Consumer.objects.get_or_create(
email=self.email,
defaults={'first_name': self.first_name, 'last_name': self.last_name}
)
return super().save(*args,**kwargs)

因此,如果该电子邮件已经有一个Consumer,我们只需检索它,否则我们创建它并检索它。然后,我们将响应设置为 self.consumer,并保存对象。

但请注意,这样做不太安全:.save(..) 可能会被否决,例如在 .bulk_create(..) [Django-doc] 中。 。此外,您还可以在此处复制数据。如果稍后更新您的 Case 对象,它将不再同步。

关于python - 在模型上的 save() 覆盖期间查询中没有匹配的对象 - 抛出DoesNotExist错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56693415/

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