:::info 💡 满足业务需求的增删改查接口的编写,删和改同理,与以下示例相通。
查询分filter和get查询方式、一对一查询举例,以及正向反向查询等举例。 :::

汇报人:puppet洛洛
日期:2022年5月13日17:41:34

1.注册接口(写入操作)

  1. # ----------------------------------------------------
  2. # 注册、登录、 登出 User.objects.create
  3. # ----------------------------------------------------
  4. def register(request):
  5. """
  6. Getting username and password from register page, then do something about register checking.
  7. :param request:
  8. :return:
  9. """
  10. data = {
  11. "status": 200,
  12. "msg": "success",
  13. "results": [
  14. {
  15. "title": '*',
  16. "price": '*',
  17. }
  18. ]
  19. }
  20. if request.method == 'GET':
  21. return JsonResponse(data)
  22. elif request.method == 'POST':
  23. username = 'zy5'
  24. password = '1'
  25. telephone = '13147164200'
  26. # create_user can change the pwd to be encrypted.
  27. # OnetooneFiled can inline 2 tables.
  28. userObj = User.objects.create_user(username=username, password=password)
  29. newUser = UserExtend(user=userObj, telephone=telephone)
  30. newUser.save()
  31. return JsonResponse(data)

上面接口主要是新增一条数据,在写入Django自带的User表时,同时吧与其一对一关联的UserExtend表一起更新,最主要的就是29-31行代码要注意:
1,新增User表里的数据不要用create,要用create_user,这样可以避免插入的用户password字段是明文的。
2,在插入user表后,把产生的user对象带入关联表(也可以加管理表里的其他字段,如telephone)进行关联表的插入,UserExtend(user=userObj, telephone=telephone),最后记得保存。

2.postman调用接口

有时候我们写接口会通过request.POST.get如下方式编写,不管是POST还是GET,对于postman都是调用不通的,但是用testapi.py可以调通。

username = str(request.POST.get(‘username’)).strip()

那我们需要用什么调用呢?用这个:

json.loads(request.body, encoding=’utf-8’)

  1. import requests
  2. url = 'http://192.168.103.68:8000/article/test'
  3. data = {
  4. 'username': 'z11'
  5. }
  6. response = requests.post(url=url, data=data)
  7. print(response.json())

3.注意点

1,第三行和第四行的区别:
3行是只返回user表的username一个字段,4行返回所有字段(不推荐)

  1. input = json.loads(request.body, encoding='utf-8')
  2. username = input.get('username')
  3. userObj = User.objects.filter(username=username).values('username')
  4. # userObj = User.objects.all().values()
  5. results = {}
  6. results["data"] = list(userObj)
  7. return JsonResponse(results, safe=False)

image.png

4,一对一查询(oneToonefiled)

4.1,查询前先高清几个概念

  • 主表和子表,带有oneToonefiled、manyTomany或foreignkey的是子表,被关联的表是主表。
  • 查询分get和filter两种形式,查出来的对象分别是model对象和queryset对象。get查询结果应该只有0或者1条,查询不到时可以设置兜底值。
  • 一对一、多对多、外键查询这几种方式分为正向查询和反向查询。

4.2,查询
了解到上述几个概念后,很容易知道查询方式是什么,举例:
Django自带User表(有username字段)是主表,将UserExtend表(有telephone字段)关联到User表上,如表设计。

  1. class UserExtend(models.Model):
  2. """用户扩展表"""
  3. user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
  4. telephone = models.CharField('电话', default=0000, max_length=11, blank=True)

1,filter查询
这种查询方式是得到queryset,因此正向和反向查询都是要把相关联的字段值查询到后给到另一个表作为查询条件去查询,因此正向反向的区别不是很大,具体举例:

  1. username = json.loads(request.body).get('username')
  2. userObj = User.objects.filter(username=username).values()
  3. print(list(userObj))
  4. ueserExtendObj = UserExtend.objects.filter(user_id=list(userObj)[0].get('id')).values()
  5. print(list(ueserExtendObj))

先用filter查出User表的userObj这个queryset对象,再通过list(userObj)[0].get(‘id’)取出具体值作为UserExtend表的查询条件,最后得到结果,反向查询也基本一样。
2,get查询

  1. u1 = User.objects.get(username=username)
  2. u2 = User.objects.filter(username=username)
  3. print(type(u1), type(u2))
  4. # <class 'django.contrib.auth.models.User'> <class 'django.db.models.query.QuerySet'>
  5. t = u1.userextend.telephone
  6. print(t)

先用get查出u1对象(u2对象是queryset对象参照),然后打印类型即可看到两种对象类型,再通过t = u1.userextend.telephone将u1对象后面带上子表小写名称,就关联上2张表了,后面就可以带上子表的具体字段了。
因为我们先查主表,所以以上是反向查询,正向查询其实也一样。
参看文档