如何将数据插入CreateAPIVIew的响应

时间:2018-07-14 18:19:59

标签: django django-rest-framework

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

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,并且只有在保存模型之后才进行计算。我知道我可以选择在响应中包括其puid的instance = serializer.save(puid={puid}),但是如果在检索puid的时间与保存该项目本身之间保存了另一个Item的情况下,这将为竞赛条件留出空间而且我还需要防止这种情况。有什么方法可以使我的数据不冒风险?

1 个答案:

答案 0 :(得分:0)

首先,编写一个序列化器类,该类在其上覆盖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