Python 使用Django序列化程序插入多个关系数据

Python 使用Django序列化程序插入多个关系数据,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,以下是我的详细情况 models.py class Employee(models.Model): EmployeeId = models.AutoField(primary_key=True, db_column='EmployeeId') EmployeeCode = models.CharField(max_length=50, unique=True, null=False, blank=False) EmployeeName = models.CharField

以下是我的详细情况

models.py

class Employee(models.Model):
    EmployeeId = models.AutoField(primary_key=True, db_column='EmployeeId')
    EmployeeCode = models.CharField(max_length=50, unique=True, null=False, blank=False)
    EmployeeName = models.CharField(max_length=50)
    EmployeeStatus = models.SmallIntegerField(default=1, null=True, blank=True)
    CreatedDate = models.DateField(null=True, default=None, blank=True)
    CreatedUser = models.ForeignKey(Login, on_delete=models.PROTECT, db_column='CreatedUser',
                                related_name='CreatedUser', null=True, default=None, blank=True)
    Device = models.ManyToManyField(Device, through='EmployeeDevice')

    class Meta:
        db_table = "Employee"


class EmployeeDevice(models.Model):
    EmpDeviceId = models.AutoField(primary_key=True, db_column='EmpDeviceId')
    Employee = models.ForeignKey(Employee, db_column='EmployeeId', on_delete=models.CASCADE)
    Device = models.ForeignKey(Device, db_column='DeviceId', on_delete=models.CASCADE)

    class Meta:
        db_table = "EmployeeDevice"
序列化程序.py

class EmployeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee
        fields = '__all__'
views.py

@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def employee_update(request):
    try:
        login = Login.objects.get(UserId=1)
        emp_serializer = EmployeeSerializer(data=request.data)
        if emp_serializer.is_valid():
            emp_serializer.save()
            device = Device.objects.all()
            for devicedata in device:
               emp_serializer.Device.add(devicedata)

        else:
            logging.getLogger("error_logger").exception(emp_serializer.errors)
            return Response(emp_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    except Exception as ex:
        logging.getLogger("error_logger").exception(repr(ex))
        return Response({'Exception': repr(ex)}, status=status.HTTP_400_BAD_REQUEST)
这是我的密码 但它不能正常工作 未保存设备详细信息,显示错误 “异常”:“AttributeError('EmployeeSerializer'对象没有属性'Device'”) 我还想用现有数据保存CreatedDate和CreatedUser。 插入后如何获取主键值


如何执行此操作?

因为您为“设备”字段设置了属性“通过”,所以您更改了可以访问设备的名称。根据django,您可以删除属性或将其更改为“through='Device'”

因为您将“Device”字段的属性设置为“through”,所以您更改了可以访问设备的名称。根据django的说法,您可以在
EmployeeSerializer
中删除属性或将其更改为“through='Device'”

,您可以覆盖
create
方法。首先创建并保存
员工
,然后可以向其添加
设备

def create(self, validated_data):
        emp_obj = Employee.objects.create(**validated_data)
        emp_obj.save()
        device = Device.objects.all()
        for devicedata in device:
            emp_obj.Device.add(devicedata.id)
        return emp_obj
views.py

@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def employee_update(request):
    try:
        login = Login.objects.get(UserId=1)
        emp_serializer = EmployeeSerializer(data=request.data)
        if emp_serializer.is_valid():
            emp_serializer.save()
            # REMOVE UNNECESSARY CODE FROM HERE
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            logging.getLogger("error_logger").exception(emp_serializer.errors)
            return Response(emp_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    except Exception as ex:
        logging.getLogger("error_logger").exception(repr(ex))
        return Response({'Exception': repr(ex)}, status=status.HTTP_400_BAD_REQUEST)

此外,如果您只需要
响应中的特定字段,则可以解析
序列化程序.data
并根据需要返回它们。

EmployeeSerializer
中,您可以覆盖
创建
方法。首先创建并保存
员工
,然后可以向其添加
设备

def create(self, validated_data):
        emp_obj = Employee.objects.create(**validated_data)
        emp_obj.save()
        device = Device.objects.all()
        for devicedata in device:
            emp_obj.Device.add(devicedata.id)
        return emp_obj
views.py

@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def employee_update(request):
    try:
        login = Login.objects.get(UserId=1)
        emp_serializer = EmployeeSerializer(data=request.data)
        if emp_serializer.is_valid():
            emp_serializer.save()
            # REMOVE UNNECESSARY CODE FROM HERE
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            logging.getLogger("error_logger").exception(emp_serializer.errors)
            return Response(emp_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    except Exception as ex:
        logging.getLogger("error_logger").exception(repr(ex))
        return Response({'Exception': repr(ex)}, status=status.HTTP_400_BAD_REQUEST)

此外,如果您只需要
响应中的特定字段
,您可以解析
序列化程序.数据
,并根据需要返回它们。

HI@babak gholamirad,EmployeeDevice我的一个模型,我不明白这个概念,使用employee对象时,同样的逻辑也起作用。。但是使用序列化程序如何修改代码呢?嗨@babak gholamirad,EmployeeDevice是我的一个模型,我不明白这个概念,使用employee对象时,同样的逻辑也起作用。。但是使用序列化程序如何修改代码?