【问题标题】:insert ManyToMany relation data using Django serializers使用 Django 序列化器插入多对多关系数据
【发布时间】:2020-10-28 00:02:47
【问题描述】:

以下是我的详细信息。

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"

serializer.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)

这是我的代码 但它不能正常工作 设备详细信息未保存显示错误 "Exception": "AttributeError("'EmployeeSerializer' 对象没有属性 'Device'",)" 而且我想用现有数据保存 CreatedDate 和 CreatedUser 。 以及插入后如何获取主键值?

我该怎么做?

【问题讨论】:

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:

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

    【讨论】:

    • 嗨 @babak gholamirad ,EmployeeDevice 我的模型之一。 ,我不明白这个概念..,相同的逻辑在使用员工对象时起作用..但是使用序列化程序如何修改代码?
    【解决方案2】:

    在您的EmployeeSerializer 中,您可以覆盖您的create 方法。首先创建并保存Employee,然后您可以添加Device

    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)
    

    此外,如果您只需要 Response 中的特定字段,您可以解析 serializer.data 并根据需要返回它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2013-05-19
      • 1970-01-01
      • 2019-04-10
      • 2021-06-12
      • 1970-01-01
      • 2019-07-29
      相关资源
      最近更新 更多