如何在管理站点中创建objet时执行perfom_create。 Django RestFramework

时间:2017-01-25 17:38:33

标签: python django django-rest-framework

我有一个对象的perform_create,它创建了另一个对象。

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()

如您所见,当我创建DocumentDetailSample时,也会创建DocumentDetail

当我做一个" POST"它很好用。

我的问题是,DocumentDetailSamples也可以在管理站点中创建。所以...当它在管理员网站中创建时,perform_create不再有效,并且DocumentDetail未创建。

我该怎么办?我想在" admin"之后立即创建DocumentDetail。创建DocumentDetailSample

1 个答案:

答案 0 :(得分:1)

信号是这项工作的有用工具(docs

使用post_save信号,每次保存模型实例时都可以运行一个函数,无论它保存在何处。 post_save信号提供创建的参数,因此您只能在创建对象时运行该函数

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()