Django更新后在Django插入中执行重复键冲突 [英] duplicate Key violation in Django insert doing after Django update

查看:259
本文介绍了Django更新后在Django插入中执行重复键冲突的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先我更新我的模型实例,之后我尝试插入新数据但显示

first i update my model instance, after that i tried to insert a new data but showing

IntegrityError('重复键值违反了唯一约束 RFIDActivation_ActivationId_key \nDETAIL :键( ActivationId)=(6de9ed9a)已经存在。\n',)

"IntegrityError('duplicate key value violates unique constraint "RFIDActivation_ActivationId_key"\nDETAIL: Key ("ActivationId")=(6de9ed9a) already exists.\n',)"

Models.py

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

my 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()显示异常例外

but rfid_serializer.save() shows exceptionexception

先前的ActivationId用于保存新数据。 ActivationId是唯一的,并且是自动生成的。我该如何解决。错误显示尝试在更新查询后插入

Previous ActivationId is using to saving the new data. ActivationId is unique and auto generated. How can i solve this. Error is showing trying to insert after update query

view.py以仅工作正常代码。

view.py for working fine code only insertion.

@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() 具有基于创建和更新的不同行为。如果将实例传递给序列化程序,它将更新对象,否则,将创建一个新对象

In restframework, serializer.save() has different behavior based on creation and update. If you pass instance to serializer, it will update the object, otherwise, it will create a new one

@api_view(['POST', 'PUT'])
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)

    # PUT 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(instance=rfid, data=rfid_activation, partial=True)
        if rfid_serializer.is_valid():
            rfid_serializer.save()
            return Response(rfid_serializer.data)
        return Response(rfid_serializer.errors, status=status.HTTP_400_BAD_REQUEST)


< h3> UPDATE

默认是在 导入时间 ,对于您来说, activation_id 的默认值只计算一次,以后的实例永远不会更改。
您必须定义一个函数,因此默认的callable会在每次创建对象时进行更新,更多信息此处

UPDATE

default is calculated at import time, in your case, your default value for activation_id is calculated once and never change for subsequent instances. You have to define a function, thus default callable will be updated each time on object creation, read more 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)

这篇关于Django更新后在Django插入中执行重复键冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆