giv*_*ivp 11 python django django-models
我正在尝试在保存后立即更新记录.这个例子似乎毫无意义,但想象一下,我们需要在保存数据后使用API来获取一些额外的信息并更新记录:
def my_handler(sender, instance=False, **kwargs):
t = Test.objects.filter(id=instance.id)
t.blah = 'hello'
t.save()
class Test(models.Model):
title = models.CharField('title', max_length=200)
blah = models.CharField('blah', max_length=200)
post_save.connect(my_handler, sender=Test)
Run Code Online (Sandbox Code Playgroud)
所以'extra'字段应该在每次保存后设置为'hello'.正确?但它不起作用.
有任何想法吗?
oza*_*zan 19
当您发现自己使用post_save信号更新发送者类的对象时,您可能应该覆盖save方法.在您的情况下,模型定义将如下所示:
class Test(models.Model):
title = models.CharField('title', max_length=200)
blah = models.CharField('blah', max_length=200)
def save(self, force_insert=False, force_update=False):
if not self.blah:
self.blah = 'hello'
super(Test, self).save(force_insert, force_update)
Run Code Online (Sandbox Code Playgroud)
post_save处理程序不接受实例吗?你为什么用它过滤?为什么不这样做:
def my_handler(sender, instance=False, created, **kwargs):
if created:
instance.blah = 'hello'
instance.save()
Run Code Online (Sandbox Code Playgroud)
您现有的代码不起作用,因为它循环,并Test.objects.filter(id=instance.id)返回一个查询集,而不是一个对象.要直接获取单个对象,请使用Queryset.get().但你不需要在这里这样做.创建的参数使其不会循环,因为它只是第一次设置它.
通常,除非您绝对需要使用post_save信号,否则无论如何都应该覆盖对象的save()方法.