我目前有以下代码,这些代码在创建对象时返回项目的序列化。
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的情况下,这将为竞赛条件留出空间而且我还需要防止这种情况。有什么方法可以使我的数据不冒风险?
答案 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