我有一个对象的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
。
答案 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()