2011-09-11 34 views
13

Tôi cố gắng để thiết lập một số máy thu post_save tương tự như saudjango post_save tín hiệu trên bản cập nhật

@receiver(post_save, sender=Game, dispatch_uid='game_updated') 
def game_updated(sender, **kwargs): 

    '''DO SOME STUFF HERE''' 

    MyPick.objects.filter(week=game.week, team=game.home_team).update(result=home_result) 
    MyPick.objects.filter(week=game.week, team=game.away_team).update(result=away_result) 


@receiver(post_save, sender=MyPick, dispatch_uid='user_pick_updated') 
def update_standings(sender, **kwargs): 
    '''DO STUFF''' 

Người nhận đầu tiên là nhận được gọi một cách chính xác sau khi cập nhật trên đối tượng trò chơi, tuy nhiên các cuộc gọi để cập nhật trên Đối tượng MyPick không gây ra người nhận thứ hai được gọi. Các tín hiệu post_save không hoạt động trên cập nhật hoặc tôi thiếu cái gì khác ở đây?

Cảm ơn

Trả lời

39

update() is converted directly to an SQL statement; nó không gọi save() trên các phiên bản mẫu và do đó các tín hiệu pre_savepost_save không được phát ra. Nếu bạn muốn người nhận tín hiệu của bạn được gọi, bạn nên lặp qua queryset, và cho mỗi trường hợp mô hình, thực hiện thay đổi của bạn và gọi save() mình.

+21

@SilverLight, phương thức 'update' trên các phiên bản mẫu phát ra' pre_save'. Phương thức 'update' trên querys không. –

+0

Chỉ cần làm rõ sau đó: Phương thức 'update' trên một cá thể mô hình có phát' post_save' quá hay chỉ 'pre_save'? – guival

9

Chỉ một điều nữa là câu trả lời của @Ismali Badawi.


này gọipost_save

user = User.objects.get(id=1) 
user.username='edited_username' 
user.save() 

này không gọipost_save

User.objects.filter(id=1).update(username='edited_username') 

Trong mã,

from django.db.models.signals import post_save 

@receiver(post_save, sender=User) 
def do_something_when_user_updated(sender, instance, created, **kwargs): 
    if not created: 
     # User object updated 
     user_obj = instance 
     pass 
Các vấn đề liên quan