Python 使用Django序列化程序插入多个关系数据
以下是我的详细情况 models.pyPython 使用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
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对象时,同样的逻辑也起作用。。但是使用序列化程序如何修改代码?