2017-01-25 4 views
0

私は別のオブジェクトを作成するオブジェクトのperform_createを持っています。objetが管理サイトで作成されたときにperfom_createする方法。 Django RestFramework

class DocumentDetailSampleViewSet(viewsets.ModelViewSet): 
    queryset = DocumentDetailSample.objects.all() 
    serializer_class = DocumentDetailSampleSerializer 

    def perform_create(self, serializer): 
     doc_detail_sample = serializer.save() 
     query_set = User.objects.all() 
     ids = query_set.values_list('id', flat=True) 
     for i in ids: 
      doc_detail = DocumentDetail() 
      doc_detail.details_sample = doc_detail_sample 
      doc_detail.user_id_id = str(i) 
      doc_detail.save() 

私はDocumentDetailも作成されDocumentDetailSampleを作成するときに、見ることができるように。

「POST」を実行するとうまく動作します。

私の問題は、DocumentDetailSamplesも管理サイトで作成できることです。だから... Adminサイトで作成されたときは、perform_createはもう動かず、DocumentDetailは作成されません。

私は何ができますか? "admin" DocumentDetailSampleの作成直後にもDocumentDetailを作成したいと思います。

答えて

1

信号を使用すると、関数にモデルのインスタンスが保存されるたびに、それが保存されているからに関係なく実行することができますpost_save信号を使用して、このジョブ(docs

ための便利なツールです。オブジェクトが

from django.db.models.signals import post_save 
from django.dispatch import receiver 
from myapp.models import DocumentDetailSample 


@receiver(post_save, sender=DocumentDetailSample) 
def my_handler(sender, **kwargs): 
    if kwargs['created']: 
     query_set = User.objects.all() 
     ids = query_set.values_list('id', flat=True) 
     for i in ids: 
      doc_detail = DocumentDetail() 
      doc_detail.details_sample = kwargs['instance'] 
      doc_detail.user_id_id = str(i) 
      doc_detail.save() 
+0

おかげで作成されたときにのみ機能を実行するようpost_save信号が作成された引数を提供しています!どこでその機能を書くべきですか? views.py?また、 "post_save"をインポートし、受信機で "pre_save"を使用します。どちらが正しいですか? :) –

+0

いいね!ありがとう!!! :) だから、ええ、私はviews.pyに書きました、そしてそれはpost_saveです。 _pre_save_に 'created'がありません:)ありがとう! –

関連する問題