首页 > 解决方案 > 如何在 CreateAPIVIew 的响应中插入数据

问题描述

我目前有以下代码,它在创建对象时返回项目的序列化。

class Item(Model):
    name = models.CharField(max_length=20, null=False)
    uid = models.CharField(max_length=40, null=False, default=uuid1)
    puid = models.CharField(max_length=40, null=True)


class ServerCreateView(CreateAPIView):

    def perform_create(self, serializer):

        # Create
        instance = serializer.save()

        # Updates its previous uid
        puid = self.model_class.objects\
            .values_list('uid', flat=True)\
            .filter(pk__lt=instance.pk)\
            .order_by('-pk')[:1][0]

        self.model_class.objects
            .filter(pk=instance.pk)\
            .update(puid=puid, sdtc=datetime.now())

不过,我需要能够返回它的 puid,并且在保存模型之前不会计算它。我知道我可以选择instance = serializer.save(puid={puid})将其 puid 包含在响应中,但是如果在检索 puid 和保存项目本身之间保存另一个项目并且我还需要防止这种情况。有什么方法可以做到这一点,而不会使我的数据面临风险?

标签: djangodjango-rest-framework

解决方案


首先,编写一个序列化程序类,在此覆盖 create 函数。

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model= mymodel
        fields=(add your desire fields)
    def create(self, validated_data):
        #do some process
        mymodel_obj=mymodel.objects.create()
        return mymodel_obj

推荐阅读