1、创建用户,用户中包含部门,报错:Author.department 必须是Department 的实例
ValueError at /addAuthor Cannot assign "'1'": "Author.department" must be a "Department" instance.
解决办法:
①修改models.ForeignKey()on_delete属性设置
添加了on_delete属性,表明加了外键,会有关联关系。
注意:django 2.0之后的版本都必须设置on_delete
当一个model对象的ForeignKey关联的对象被删除时,默认情况下此对象也会一起被级联删除的。
CASCADE: 默认值,model对象会和ForeignKey关联对象一起被删除
SET_NULL: 将model对象的ForeignKey字段设为null。当然需要将null设为True。
SET_DEFAULT:将model对象的ForeignKey字段设为默认值。
Protect: 删除ForeignKey关联对象时会生成一个ProtectedError,这样ForeignKey关联对象就不会被删除了。
SET(): 将model对象的ForeignKey字段设为传递给SET()的值。
DO_NOTHING: 啥也不做。
②修改 接口获取外键值,因为用户部门信息级联 部门表,所以需要此关联设置
2、获取author页面表格数据
TypeError: Object of type 'datetime' is not JSON serializable
def getAuthor(request):
if request.method == "GET":
list = models.Author.objects.all()
print (list)
authorList = []
for li in list:
authorList.append({
"id": li.id,
"name": li.name,
"sex": li.sex,
"department": li.department,
"pthone": li.pthone,
"publish_date": li.publish_date,
})
# 将int类型使用dumps()方法转为str类型
author_len = json.dumps(len(authorList))
# 构造一个字典
json_data_list = {
'ret': {
'success': True,
'retCode': 200,
'retMsg': "查询成功!"
},
'rows': authorList,
'total': author_len
}
return HttpResponse(json.dumps(json_data_list), content_type='application/json; charset=utf-8')
解决办法:重写时间处理方法,设置默认的datatime
# -*- coding:utf-8 -*-
import json
import datetime
# python自带的json,将数据转换为json数据时,datetime格式的数据报错. 所以重写构造json类,遇到日期特殊处理
class DateEncoder(json.JSONEncoder):
def default(self, obj):
# if isinstance(obj, datetime.datetime):
# return int(mktime(obj.timetuple()))
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, date):
return obj.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, obj)
from proApp.common import DateEncoder #这里from 引入的全局,不然会报错找不到common模块
json.dumps(li.publish_date, cls=DateEncoder)
返回数据还有点小问题:时间数据 多一层双引号
解决办法:相关链接:https://www.cnblogs.com/xiaomingzaixian/p/7286793.html
json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串)
(1)json.dumps()函数是将一个Python数据类型列表进行json格式的编码 === json.dumps() 字典转化为字符串
(2)json.loads()函数是将json格式数据转换为字典 === json.loads() 字符串转化为字典
因为json.dumps()处理过得数据是字符串格式,所以后面return 再返回前端数据时进行json.dumps()转化会在多一层引号
所以: 这里在获取到日期的地方使用json.loads()将json.dumps()数据再格式化一下即可
3、修改author页面表格数据
TypeError: int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'