Vue+Django开发过程问题整合

Vue+Django开发过程问题整合

vue同步与异步

vue的方法是顺序调用的,方法体内也是顺序执行的,但是无法保证先调用的方法先执行结束,即方法内是同步的,但是方法间是异步的

解决方法:

使用async和await修饰符,使方法间同步

async用于修饰函数,表示该函数异步,该函数执行不会阻塞后面代码的执行,await只能放在async修饰的函数内,表示需要等待await修饰的函数执行结束后才继续执行后面的代码

1
2
3
4
5
async method(){
await method1()
await method2()
await method3()
}

vue丢失后端数据的精度

后端的数据为64位长整数,前端javascript数字为64位,但整数最多为15位,因此后端的数据超过前端能表示的最大整数时,前端的数据将溢出

javascript数字表示见:JavaScript Number 对象 | 菜鸟教程

解决方法:

后端将长整数转换为字符串传给前端,接收前端返回的数据字符串后转换为长整数

该问题出现在数据库id上,后端需根据前端返回的id查询数据库,理论上来说,后端可以不用将该字符串转换为长整数,因为在这种情况下,mysql会将字符串转换为匹配对应字段的数据类型,但是只使用字符串的前导数字,即在第一个非数字字符及其之后的所有字符会被丢弃

mysql查询字符串转换为数字见:在MySQL中使用字符串查询Int字段的奇怪行为 - 问答 - 腾讯云开发者社区-腾讯云 (tencent.com)

django的json编码

django视图层函数返回数据时需要先将其转成json,json默认的编码器无法转换datetime对象

解决方法:

构造json编码器以转换datetime对象

1
2
3
4
5
6
7
8
9
10
11
12
import json
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S")
else:
return json.JSONEncoder.default(self, obj)

def view1(request):
# ...
json_data = json.dumps(data, cls=MyEncoder)
return HttpResponse(json_data, content_type="application/json")

django外键与外键_id

django当表含有外键时,该表对象的字段除了有外键之外,还有外键_id

该外键字段返回的是对应主键所在表的一条数据,是一个表对象,而外键_id字段返回的是对应的值

1
2
3
class TableB(models.Model):
b_id = models.AutoField(primary_key=True)
a_id = models.ForeignKey(to=TableA, db_column='a_id', on_delete=models.CASCADE)
1
2
3
4
def show_table_b(request):
b = TableB.objects.get(b_id=1)
print(b.a_id) # TableA对象
print(b.a_id_id) # 值

django与单例模式

django视图层需要一些全局的数据,供函数读取

解决方法:

通过单例模式构造一个存储全局数据的类(也可以使用数据库存储,该方法的优点是节省空间,适用于少量数据)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Singleton(object):
_instance_lock = threading.Lock()

def __new__(cls, *args, **kwargs):
with Singleton._instance_lock:
if not hasattr(Singleton, "_instance"):
Singleton._instance = object.__new__(cls)
return Singleton._instance

def __init__(self):
data()

def data(self):
# ...

Vue+Django开发过程问题整合
https://wangaaayu.github.io/blog/posts/977e27a9/
作者
WangAaayu
发布于
2023年7月12日
更新于
2023年7月13日
许可协议