Django 更新后 Django 插入中的重复键冲突
duplicate Key violation in Django insert doing after Django update
首先我更新我的模型实例,然后我尝试插入新数据但显示
“完整性错误('duplicate key value violates unique constraint "RFIDActivation_ActivationId_key"\nDETAIL: Key ("ActivationId")=(6de9ed9a) already exists.\n',)”
Models.py
class RFIDActivation(models.Model):
RFIDActivationId = models.AutoField(primary_key=True, db_column='RFIDActivationId')
Device = models.ForeignKey(Device, on_delete=models.CASCADE, db_column='DeviceId')
Employee = models.ForeignKey(Employee, on_delete=models.CASCADE, db_column='EmployeeId')
ActivationId = models.CharField(max_length=10, unique=True, default=uuid4().hex[:8])
ActivationStatus = models.CharField(max_length=1)default=None)
class Meta:
db_table = "RFIDActivation"
我的serializer.py
class RFIDActivationSerializer(serializers.ModelSerializer):
class Meta:
model = RFIDActivation
fields = '__all__'
view.py
@api_view(["POST"])
@permission_classes([IsAuthenticated])
def rfid_activation_initial(request):
RFIDActivation.objects.filter(Employee=request.POST.get("Employee")).update(
ActivationStatus='2',
ActivationMessage='Abort'
)
rfid_activation = {
'Employee': request.POST.get("Employee"),
'Device': request.POST.get("Device"),
'ActivationStatus': "0",
'ActivationMessage': "RFID Activation Initiated"
}
rfid_serializer = RFIDActivationSerializer(data=rfid_activation)
if rfid_serializer.is_valid():
rfid_serializer.save()
但 rfid_serializer.save() 显示异常exception
以前的 ActivationId 用于保存新数据。 ActivationId 是唯一的并且是自动生成的。我该如何解决这个问题。错误显示尝试在更新查询后插入
view.py 用于仅插入工作良好的代码。
@api_view(["POST"])
@permission_classes([IsAuthenticated])
def rfid_data_add(request):
rfid_activation = {
'Employee': request.POST.get("Employee"),
'Device': request.POST.get("Device"),
'ActivationStatus': "0",
'ActivationMessage': "RFID Activation Initiated"
}
rfid_serializer = RFIDActivationSerializer(data=rfid_activation)
if rfid_serializer.is_valid():
rfid_serializer.save()
在 restframework 中,serializer.save()
具有基于创建和更新的不同行为。如果将 instance 传递给序列化程序,它将更新对象,否则,它将创建一个新的
@api_view(['POST', <b>'PUT'</b>])
def rfid_data(request, pk):
"""
Update or delete a rfid data.
"""
rfid_activation = {
...
}
if request.method == 'POST':
rfid_serializer = RFIDActivationSerializer(data=rfid_activation)
if rfid_serializer.is_valid():
rfid_serializer.save()
return Response(rfid_serializer.data,status=status.HTTP_201_CREATED)
return return Response(rfid_serializer.data, status=status.HTTP_400_BAD_REQUEST)
# <b>PUT</b> is used for object update
elif request.method == 'PUT':
rfid = RFIDActivation.objects.get(pk=pk)
# pass instance to your serializer
# pass partial=True to allow partial updates
rfid_serializer = RFIDActivationSerializer(<b>instance=rfid</b>, data=rfid_activation, <b>partial=True</b>)
if rfid_serializer.is_valid():
rfid_serializer.save()
return Response(rfid_serializer.data)
return Response(rfid_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
</pre>
更新
default
是在 import time
处计算的,在您的情况下,activation_id
的默认值计算一次,以后永远不会更改实例。
您必须定义一个函数,因此每次创建对象时都会更新默认的可调用对象,阅读更多 here
def activation_id_generator(self):
return uuid4().hex[:8]
# then in your class
class RFIDActivation(models.Model):
...
ActivationId = models.CharField(max_length=10, unique=True, default=activation_id_generator)
首先我更新我的模型实例,然后我尝试插入新数据但显示
“完整性错误('duplicate key value violates unique constraint "RFIDActivation_ActivationId_key"\nDETAIL: Key ("ActivationId")=(6de9ed9a) already exists.\n',)”
Models.py
class RFIDActivation(models.Model):
RFIDActivationId = models.AutoField(primary_key=True, db_column='RFIDActivationId')
Device = models.ForeignKey(Device, on_delete=models.CASCADE, db_column='DeviceId')
Employee = models.ForeignKey(Employee, on_delete=models.CASCADE, db_column='EmployeeId')
ActivationId = models.CharField(max_length=10, unique=True, default=uuid4().hex[:8])
ActivationStatus = models.CharField(max_length=1)default=None)
class Meta:
db_table = "RFIDActivation"
我的serializer.py
class RFIDActivationSerializer(serializers.ModelSerializer):
class Meta:
model = RFIDActivation
fields = '__all__'
view.py
@api_view(["POST"])
@permission_classes([IsAuthenticated])
def rfid_activation_initial(request):
RFIDActivation.objects.filter(Employee=request.POST.get("Employee")).update(
ActivationStatus='2',
ActivationMessage='Abort'
)
rfid_activation = {
'Employee': request.POST.get("Employee"),
'Device': request.POST.get("Device"),
'ActivationStatus': "0",
'ActivationMessage': "RFID Activation Initiated"
}
rfid_serializer = RFIDActivationSerializer(data=rfid_activation)
if rfid_serializer.is_valid():
rfid_serializer.save()
但 rfid_serializer.save() 显示异常exception
以前的 ActivationId 用于保存新数据。 ActivationId 是唯一的并且是自动生成的。我该如何解决这个问题。错误显示尝试在更新查询后插入
view.py 用于仅插入工作良好的代码。
@api_view(["POST"])
@permission_classes([IsAuthenticated])
def rfid_data_add(request):
rfid_activation = {
'Employee': request.POST.get("Employee"),
'Device': request.POST.get("Device"),
'ActivationStatus': "0",
'ActivationMessage': "RFID Activation Initiated"
}
rfid_serializer = RFIDActivationSerializer(data=rfid_activation)
if rfid_serializer.is_valid():
rfid_serializer.save()
在 restframework 中,serializer.save()
具有基于创建和更新的不同行为。如果将 instance 传递给序列化程序,它将更新对象,否则,它将创建一个新的
@api_view(['POST', <b>'PUT'</b>]) def rfid_data(request, pk): """ Update or delete a rfid data. """ rfid_activation = { ... } if request.method == 'POST': rfid_serializer = RFIDActivationSerializer(data=rfid_activation) if rfid_serializer.is_valid(): rfid_serializer.save() return Response(rfid_serializer.data,status=status.HTTP_201_CREATED) return return Response(rfid_serializer.data, status=status.HTTP_400_BAD_REQUEST) # <b>PUT</b> is used for object update elif request.method == 'PUT': rfid = RFIDActivation.objects.get(pk=pk) # pass instance to your serializer # pass partial=True to allow partial updates rfid_serializer = RFIDActivationSerializer(<b>instance=rfid</b>, data=rfid_activation, <b>partial=True</b>) if rfid_serializer.is_valid(): rfid_serializer.save() return Response(rfid_serializer.data) return Response(rfid_serializer.errors, status=status.HTTP_400_BAD_REQUEST) </pre>
更新
default
是在import time
处计算的,在您的情况下,activation_id
的默认值计算一次,以后永远不会更改实例。 您必须定义一个函数,因此每次创建对象时都会更新默认的可调用对象,阅读更多 heredef activation_id_generator(self): return uuid4().hex[:8] # then in your class class RFIDActivation(models.Model): ... ActivationId = models.CharField(max_length=10, unique=True, default=activation_id_generator)