2017-11-30 49 views
8

TL; DR:
Tôi cần một cách để kích hoạt một tín hiệu tùy chỉnh sau khi tín hiệu post_save, tự động, có cách nào để làm việc đó?Làm thế nào để gửi một tín hiệu django từ tín hiệu khác


Tôi hiện đang phát triển một thư viện cho django mà đòi hỏi rất nhiều đến và đi với tín hiệu post_save trong django và tôi đã tự hỏi nếu nó có thể kích hoạt một tín hiệu sau các post_save vì vậy tôi có thể thực hiện của riêng tôi và không can thiệp vào số post_save trong trường hợp dự án sử dụng thư viện cần thực hiện. Cho đến nay tôi biết rằng các tín hiệu dự kiến ​​sẽ nhận được một lớp như một đối số người gửi, và nếu tôi kích hoạt bằng tay tín hiệu từ post_save tôi sẽ không làm gì cả (tôi vẫn sẽ can thiệp vào nó). Có cách giải quyết nào cho vấn đề này không? Tôi có thiếu thứ gì đó trong tài liệu không?

+0

* Tại sao * bạn có cần tín hiệu tùy chỉnh không? Nếu những gì bạn cần làm xảy ra mỗi khi một cái gì đó được lưu, sau đó chỉ cần sử dụng tín hiệu 'post_save'. Không quan trọng bạn có sử dụng tất cả các đối số được truyền cho trình xử lý tín hiệu hay không. – solarissmoke

+0

Hey, @OscarCarballal Tôi đã tự hỏi, bạn có thấy câu trả lời của tôi hữu ích không? –

+0

Vâng, xin lỗi, tôi hoàn toàn quên mất việc đánh dấu nó. Cảm ơn :) –

Trả lời

6

Mặc dù điều này có thể có thể bằng cách gọi một tín hiệu bằng tay từ bên trong một tín hiệu như thế này:

post_save.send(MyModel, instance=a_mymodel_instance) 

Có nhiều cách dễ dàng hơn để làm điều gì đó như thế:

Chúng ta hãy giả sử rằng bạn làm theo các tổ chức tập tin mà tôi sử dụng trong câu trả lời này: Django Create and Save Many instances of model when another object are created


Đề xuất 1:

  • Chúng ta hãy giả sử rằng post_save đầu tiên bạn làm điều gì đó để MyModel1 và một post_save tín hiệu làm điều gì đó để MyModel2 sau khi một số xử lý trên dụ đã làm hiển thị những tín hiệu đầu tiên.
  • post_save luôn gửi tại kết thúc của phương thức save().
  • Tổ chức tín hiệu của bạn như sau:

    @receiver(post_save, sender=MyModel1) 
    def mymodel1_signal (sender, instance, **kwargs): 
        Do stuff on MyModel1 instance... 
        Do also stuff on MyModel2 and then call MyModel2.save() 
    
    
    @receiver(post_save, sender=MyModel2) 
    def mymodel2_signal (sender, instance, **kwargs): 
        Do stuff on MyModel2 instance... 
    

    Bằng cách này, tín hiệu mymodel2_signal sẽ được kích hoạt sau khi cuộc gọi đến MyModel2.save() từ mymodel1_signal.


Đề xuất 2:

  • Sử dụng một kết hợp của các tín hiệu để đạt được "thời gian" chính xác.
  • Chúng ta hãy giả sử rằng bạn muốn bắt đầu một quá trình trên MyModel2 trước một MyModel1 get của lưu
  • Sử dụng một pre_savepost_save tín hiệu:

    @receiver(pre_save, sender=MyModel1) 
    def mymodel1_signal (sender, instance, **kwargs): 
        Do stuff on MyModel1 instance... 
        Do also stuff on MyModel2 and then call MyModel2.save() 
    
    
    @receiver(post_save, sender=MyModel2) 
    def mymodel2_signal (sender, instance, **kwargs): 
        Do stuff on MyModel2 instance... 
    

Gợi ý 3:

Sử dụng MyModel2 phương pháp trực tiếp bên trong tín hiệu MyModel1post_save.

+0

khi hoạt động nhiều trường hợp, chúng tôi có thể sử dụng kênh django để triger một nhiệm vụ ẩn để làm điều đó. – Hayden

+0

@Hayden Tôi không có kinh nghiệm tại thời điểm này với các kênh django. Vì vậy, những gì bạn nói có vẻ thú vị :) –

Các vấn đề liên quan