大家好,我在使用 django drf 的时候遇到了一个问题,找了一堆资料,暂时还没找到好的解决方法,希望有懂的兄弟可以给指点一下。非常感谢。
class ProjectStatusModels(models.Model):
name = models.CharField(max_length=150,verbose_name='状态名称',unique=True,db_index=True)
def __str__(self):
return self.name
class Meta:
verbose_name = '项目状态管理表'
ordering = ('-id',)
class ProjectModels(models.Model):
project_id = models.CharField(verbose_name='项目编号',max_length=120,unique=True,db_index=True)
name = models.CharField(verbose_name='项目名称',max_length=150)
customer_name = models.CharField(verbose_name='客户名称',max_length=150,null=True,blank=True)
evaluation = models.IntegerField(verbose_name='项目估价',null=True,blank=True)
start_date = models.DateField(verbose_name='项目开始日期',null=True,blank=True)
expiration_date = models.DateField(verbose_name='项目截止日期',null=True,blank=True)
sales_name = models.ForeignKey(EmployeeModels,on_delete=models.DO_NOTHING,verbose_name='销售经理',null=True,blank=True)
status = models.ForeignKey(ProjectStatusModels,on_delete=models.DO_NOTHING,verbose_name='状态',null=True,blank=True,db_index=True)
create_time = models.DateTimeField(verbose_name='发布时间', auto_now_add=True)
update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)
def __str__(self):
return self.name
class Meta:
verbose_name = '项目管理表'
ordering = ('-id',)
class ProjectJsonView(APIView):
def get(self,request,*args,**kwargs):
project_id = request.query_params.get('project_id')
if not project_id:
project_obj = project_models.ProjectModels.objects.all()
ser = admin_project_serializers.ProjectModelsSerializers(instance=project_obj,many=True)
else:
project_obj = project_models.ProjectModels.objects.filter(id=project_id).first()
ser = admin_project_serializers.ProjectModelsSerializers(instance=project_obj,many=False)
return Response({
'status_code':20000,
'code':0,
'data':ser.data
})
def post(self,request,*args,**kwargs):
# 新增项目
req = {
'status_code':20000,
'msg':'新增成功'
}
ser = admin_project_serializers.ProjectModelsSerializers(data = request.data)
if ser.is_valid():
ser.save()
else:
req['status_code'] = 50000
req['msg'] = str(ser.errors)
return Response(req)
def put(self,request,*args,**kwargs):
# 编辑现有项目
req = {
'status_code':20000,
'msg':'修改成功'
}
sid = request.data.get('id')
project_obj = project_models.ProjectModels.objects.filter(id=sid).first()
ser = admin_project_serializers.ProjectModelsSerializers(data=request.data,instance=project_obj)
if ser.is_valid():
print('ser.validated_data:',ser.validated_data)
ser.save()
else:
req['status_code'] = 50000
req['msg'] = str(ser.errors)
return Response(req)
def delete(self,request,*args,**kwargs):
project_id = request.data.get('project_id')
project_obj = project_models.ProjectModels.objects.filter(id=project_id).first()
project_obj.delete()
return Response({
'status_code':20000,
'msg':'删除成功'
})
class ProjectStatusModelsSerializers(serializers.ModelSerializer):
# 项目状态序列化器
class Meta:
model = project_models.ProjectStatusModels
fields = '__all__'
class ProjectModelsSerializers(serializers.ModelSerializer):
# 项目序列化器
class Meta:
model = project_models.ProjectModels
fields = '__all__'
depth = 1
在项目 查询的时候可以返回如下的字段
{
"status_code": 20000,
"code": 0,
"data": [
{
"id": 5,
"status": null,
"project_id": "asdasdasd",
"name": "123123123",
"customer_name": "Abcd",
"evaluation": null,
"start_date": null,
"expiration_date": null,
"create_time": "2021-04-04T23:17:58.433641",
"update_time": "2021-04-04T23:17:58.433666",
"sales_name": null
},
{
"id": 4,
"status": null,
"project_id": "sss03",
"name": "qweqqweasd",
"customer_name": "",
"evaluation": 10000,
"start_date": null,
"expiration_date": null,
"create_time": "2021-04-04T23:17:03.571699",
"update_time": "2021-04-04T23:17:03.571714",
"sales_name": null
},
{
"id": 3,
"status": null,
"project_id": "sss01",
"name": "asasas",
"customer_name": "",
"evaluation": null,
"start_date": null,
"expiration_date": null,
"create_time": "2021-04-04T23:15:31.134011",
"update_time": "2021-04-04T23:15:31.134029",
"sales_name": null
},
{
"id": 2,
"status": {
"id": 2,
"name": "End"
},
"project_id": "0002",
"name": "s0002",
"customer_name": "微创医疗 111",
"evaluation": 500,
"start_date": "2021-04-04",
"expiration_date": "2021-05-11",
"create_time": "2021-04-04T22:43:18.374238",
"update_time": "2021-04-05T11:39:18.852015",
"sales_name": {
"id": 5,
"code": "0003",
"name": "endpein",
"phone": "",
"birthday": "2021-04-02",
"age": 18,
"on_the_job": true,
"identity_card": "",
"work_id": "",
"work_id_date": null,
"work_id_expiry_date": null,
"dormitory_address": "",
"passport_id": "",
"passport_expiry_date": null,
"multiskill_expiry": null,
"csoc_expiry": null,
"multiskill_category": "[]",
"bank_details": "",
"email": "280435089@qq.com",
"remarks": "哈哈哈",
"nationality": null
}
},
{
"id": 1,
"status": {
"id": 6,
"name": "asdasd"
},
"project_id": "0001",
"name": "s01 项目",
"customer_name": "微创医疗",
"evaluation": 1000,
"start_date": "2021-04-29",
"expiration_date": "2021-04-30",
"create_time": "2021-04-04T22:42:51.462897",
"update_time": "2021-04-05T14:34:03.122631",
"sales_name": null
}
]
}
但是前端传来的数据如下 ,这个数据是 request.data 输出的
<QueryDict: {'csrfmiddlewaretoken': ['ntdydSUNRztDKOKmDSST36oFnSokUFVJG0t9YLXXvQtm6hyYOPT3WHMRPahy6kz8'], 'id': ['1'], 'name': ['s01 项目'], 'project_id': ['0001'], 'customer_name': ['微创医疗'], 'evaluation': ['1000'], 'start_date': ['2021-04-29'], 'expiration_date': ['2021-04-30'], 'status': ['2'], 'sales_name': ['']}>
但是当 ser.is_valid() 在输入 validated_data 的时候 表中 status
、sales_name
这 2 个一对多的 ForeignKey 字段就没有了。输出变成了如下样式:
ser.validated_data: OrderedDict([('project_id', '0001'), ('name', 's01 项目'), ('customer_name', '微创医疗'), ('evaluation', 1000), ('start_date', datetime.date(2021, 4, 29)), ('expiration_date', datetime.date(2021, 4, 30))])
请问一下,各位高手应该如何修改和调整呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.