2016-06-27 21 views
1

我正在模型的pre_save信号中工作,我不知道如何检查记录是INSERT还是UPDATE。下面的代码(不正常):Django pre_save信号:我怎么知道它是插入还是更新

@receiver(pre_save, sender=Person) 
def pre_save_person(sender, instance, **kwargs): 

    if not instance.pk: 
     print 'INSERT !!!!!!' 
    else: 
     print 'UPDATE !!!!!!' 

你能帮我吗?该项目使用django 1.8.7。

感谢所有帮助

+0

这样会工作,只是if条件是错误的方式。 –

+0

@DanielRoseman是的,我看到如果条件错了。但它不管用。 Instance.pk总是存在 –

+1

如果pk存在,那么Django不知道它是更新还是插入。在这种情况下,Django会尝试更新,如果失败则返回插入。如果您的应用程序在保存实例之前设置了pk,那么您只能通过查询db来查找匹配的pk。 – knbk

回答

2

继@ knbk评论,instance.pk将始终存在于这一点上。你必须检查这个instance.pk是否存在于数据库中:

@receiver(pre_save, sender=Person) 
def pre_save_person(sender, instance, **kwargs): 

    num = Person.objects.filter(pk=instance.pk).count() 
    if num == 0 : 
     print 'INSERT !!' 
    else: 
     print 'UPDATE !!' 
+0

这导致了额外的数据库查询。确实,基于主键检索单个项目的速度非常快,但仍然可以尽可能避免额外的查询。 – e4c5

+0

@ e4c5好的提示和我在想同样的事情。在这种情况下你会如何避免额外的查询? – Jarad

0

if instance.pk is None: print "inserting" else: print "updating"

尝试在所有情况下,这不会工作,我建议使用post_save,你必须在标志创建除非特别需要pre_save

+0

感谢您的回答。它不起作用,instance.pk总是在那里,我不能使用post,因为我正在创建相关模型的记录 –

相关问题