Django中的Model操作表的实现


Posted in Python onJuly 24, 2018

Model 操作表

一、基本操作

# 增

models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs

obj = models.Tb1(c1='xx', c2='oo')
obj.save()

dic = {'c1':'xx','c2':'oo'}

models.Tb1.objects.create(**dic) 
#Form的产出结果是一个字典,可以根据这个Form的字典和**直接在数据库创建数据
# 查

models.Tb1.objects.get(id=123)     # 获取单条数据,不存在则报错(不建议)
models.Tb1.objects.all()        # 获取全部   .first() 取第一条数据
models.Tb1.objects.filter(name='seven') # 获取指定条件的数据  也可以用**的方式传参数

# 删

models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据

# 改

models.Tb1.objects.filter(name='seven').update(gender='0') # 将指定条件的数据更新,均支持 **kwargs

obj = models.Tb1.objects.get(id=1)
obj.c1 = '111'
obj.save()                         # 修改单条数据

细看从数据库取出的数据类型 :

w = models.Simp.objects.all()
 print w, type(w)
[<Simp: chenc>, <Simp: zan>, <Simp: zhangsan>]  <class 'django.db.models.query.QuerySet'>

可以看到,从数据库取出个数据看起来像包含对象的列表。而实际上整个数据为django中的特殊类型QuerySet。

.all()是取得所有列的数据,可以加.values()取出某一列,每一项的值为一个字典:

w = models.Simp.objects.all().values('username')
print w, type(w)

[{'username': u'chenc'}, {'username': u'zan'}, {'username': u'zhangsan'}] <class 'django.db.models.query.QuerySet'>

.values_list(),获取到的值为一个元组

w = models.Simp.objects.all().values_list('username')
print w, type(w)

[(u'chenc',), (u'zan',), (u'zhangsan',)] <class 'django.db.models.query.QuerySet'>

.values_list()也可以添加多个参数:(可以配合Form在前端生成动态的select)

w = models.Simp.objects.all().values_list('id', 'username')
print w, type(w)

[(1, u'chenc'), (2, u'zan'), (3, u'zhangsan')] <class 'django.db.models.query.QuerySet'>

query可以查看执行的sql语句:

b = models.Simp.objects.all()
print b.query

SELECT "app01_simp"."id", "app01_simp"."username", "app01_simp"."password" FROM "app01_simp"

二、进阶操作

利用双下划线将字段和对应的操作连接起来

# 获取个数
  #
  # models.Tb1.objects.filter(name='seven').count()

  # 大于,小于
  #
  # models.Tb1.objects.filter(id__gt=1)       # 获取id大于1的值
  # models.Tb1.objects.filter(id__lt=10)       # 获取id小于10的值
  # models.Tb1.objects.filter(id__lt=10, id__gt=1)  # 获取id大于1 且 小于10的值

  # in
  #
  # models.Tb1.objects.filter(id__in=[11, 22, 33])  # 获取id等于11、22、33的数据
  # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in

  # contains
  #
  # models.Tb1.objects.filter(name__contains="ven")
  # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
  # models.Tb1.objects.exclude(name__icontains="ven")

  # range
  #
  # models.Tb1.objects.filter(id__range=[1, 2])  # 范围bettwen and

  # 其他类似
  #
  # startswith,istartswith, endswith, iendswith,

  # order by
  #
  # models.Tb1.objects.filter(name='seven').order_by('id')  # asc 从小到大
  # models.Tb1.objects.filter(name='seven').order_by('-id')  # desc 从大到小

  # limit 、offset
  #
  # models.Tb1.objects.all()[10:20]

  # group by
  from django.db.models import Count, Min, Max, Sum
  # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
  # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

三、操作表之一对多实例

我们来创建一个完整的过程 特别声明:(过程繁琐无聊,纯属作者梳理思路,可以直接跳过看解析)

首先我们先来创造两张表,并设置外键。

class GroupNew(models.Model):

  groupname = models.CharField(max_length=15)


class UserNew(models.Model):

  user = models.CharField(max_length=15)
  10   group = models.ForeignKey(GroupNew)

然后再组表里创建几条数据,配置好url生成数据:

# coding:utf-8

from django.shortcuts import HttpResponse,render
from app01 import models


def Foreign(request):

  models.GroupNew.objects.create(groupname='CEO')
  models.GroupNew.objects.create(groupname='CTO')
  models.GroupNew.objects.create(groupname='COO')
  return HttpResponse('OK')

创建用于生成表单的form:(动态的select)

# coding:utf-8
from django import forms
from app01 import models


class CreateForm(forms.Form):

  user = forms.CharField(max_length=20)

  group = forms.IntegerField(widget=forms.Select())

  def __init__(self, *args, **kwargs):
    super(CreateForm, self).__init__(*args, **kwargs)

    self.fields['group'].widget.choices = models.GroupNew.objects.all().values_list('id', 'groupname')

在views.py里写好创建用户的方法,并应用form:

from app01.forms import foreign as UserForm


def createuser(request):

  obj = UserForm.CreateForm()

  return render(request, 'foreign/createuser.html', {'obj': obj})

创建一个html页面,用来在前端操作创建用户:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>

  <form action="/createuser/" method="post">

    <p>{{ obj.user }}</p>
    <p>{{ obj.group }}</p>

  <input type="submit" value="提交" />

</form>

</body>
</html>

配置好url访问成功:

Django中的Model操作表的实现

现在我们要来创建用户数据:(两种方法)

def createuser(request):

  obj = UserForm.CreateForm(request.POST)

  if request.method == 'POST':
    if obj.is_valid():
      all_data = obj.clean()

      group_id = all_data['group']
      username = all_data['user']

      # 1、先获取字典表里的数据对象
      # group_obj = models.GroupNew.objects.get(id=group_id)
      # # 创建用户数据
      # models.UserNew.objects.create(user=username, group=group_obj)

      # 2、 直接传group_id不需获取对象
      models.UserNew.objects.create(user=username, group_id=group_id)

    else:
      pass
  return render(request, 'foreign/createuser.html', {'obj': obj})

还有一种方法是根据Form的修改来创建:(注意:前端页面也需要加上_id与之匹配{{ obj.group_id }} )

forms.py

# coding:utf-8
from django import forms
from app01 import models


class CreateForm(forms.Form):

  user = forms.CharField(max_length=20)

  group_id = forms.IntegerField(widget=forms.Select()) #根据数据库存的字段来修改这里的form使之与数据库相同

  def __init__(self, *args, **kwargs):
    super(CreateForm, self).__init__(*args, **kwargs)

    self.fields['group_id'].widget.choices = models.GroupNew.objects.all().values_list('id', 'groupname')

然后再vires.py里面就可以直接拿到前端传来的字典,直接创建数据了。注意用**的方式传参

from app01.forms import foreign as UserForm


def createuser(request):

  obj = UserForm.CreateForm(request.POST)

  if request.method == 'POST':
    if obj.is_valid():
      all_data = obj.clean()
      print all_data
      # group_id = all_data['group']
      username = all_data['user']

      # 1、先获取字典表里的数据对象
      # group_obj = models.GroupNew.objects.get(id=group_id)
      # # 创建用户数据
      # models.UserNew.objects.create(user=username, group=group_obj)

      # 2、 直接传group_id不需获取对象

      models.UserNew.objects.create(**all_data)  #用**的方式传递字典参数

    else:
      pass
  return render(request, 'foreign/createuser.html', {'obj': obj})

下面我们可以来展示一下数据:

在views.pu里把数据全部拿到,返回到前端:

from app01.forms import foreign as UserForm


def createuser(request):

  obj = UserForm.CreateForm(request.POST)

  if request.method == 'POST':
    if obj.is_valid():
      all_data = obj.clean()
      models.UserNew.objects.create(**all_data)
    else:
      pass

  user_list = models.UserNew.objects.all()  #获取到表中的全部数据

  return render(request, 'foreign/createuser.html', {'obj': obj, 'user_list': user_list})

四、前端和后台获取数据 (了不起的双下划线“__”)

前端页面获取数据展示:

在前端页面不能显示用户组的id,而是直接显示用户组的名称

因为外键对应的字段是一个对象,这个对象代指的是字典表中的一行数据,所以我们在前端取到字典表中的数据用“.”获取

<table>
    {% for item in user_list %}
      <tr>
        <td>{{ item.user }}</td>
        <td>{{ item.group.groupname }}</td>  从对象中获取数据用"."
      </tr>
    {% endfor %}
  </table>

后台获取数据:(了不起的双下划线)

我们在前端用get的方法获取数据,

在浏览器的url后追加字符 http://127.0.0.1:8000/createuser/?group=CEO

例如:我们要展示CEO组里面所以得用户,在views里要如何写呢?

from app01.forms import foreign as UserForm


def createuser(request):

  obj = UserForm.CreateForm(request.POST)

  if request.method == 'POST':
    if obj.is_valid():
      all_data = obj.clean()
      models.UserNew.objects.create(**all_data)
    else:
      pass
  val = request.GET.get('group')
  user_list = models.UserNew.objects.filter(group__groupname=val)  # 去字典表里的数据时用双下划线

  return render(request, 'foreign/createuser.html', {'obj': obj, 'user_list': user_list})

五、解析与总结

所有的联表操作只需理解一点:
model中一般字段为字符串,而外键代表的是一个对象,这个对象就是字典表中的一行数据。

Django中的Model操作表的实现

创建数据:

1、根据对象级别来操作表。
表中有外键的字段代指的就是另外一张表的一行数据。在Models里的表现形式就是一个对象,那么我们创建这张表时,给外键的字段传值时也应该传一个对象,而从前台获取到的是一个数字“1”,1不是一个对象,根据这个“1”先创建一个字典表的对象,所以根据前台的“1”先获取字典表里对应的数据对象,把这个对象传递到创建表时所需的对象参数即可。
(其实也是把对象转换成sql语句拼接成带_id的样式,有一种多此一举的感觉)

2、根据数据库级别来操作表。
首先我们可以先查看一下数据库表中的外键值的样式 user_group_id。“_id”在models没有定义的,是django自动为我们定义的样式。所以我们在向数据库中插入数据的时候,外键的字段应该加上_id,这样就可以直接传从前台获取的数字了。
(可以再form中修改外键的值,加"_id",这样传到后台的数据就能直接拿到一个字典,在用**的方式传值创建数据)

获取数据:

跨表取数据用 "."
因为在models里的外键代指的是另外一张表的一行数据,且这个数据类型为一个对象。
那么就可以根据这个对象直接找到那行数据里对应的字段。用 “.”获取
在前端页面就可以{{item.group.groupname}}方式获取到。

跨表过滤数据时用 “__”
过滤数据用双下划线 “__”(group__groupname=val),如果有多张表建立外键继续用双下划线“__”跨表查询数据

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
Python中exit、return、sys.exit()等使用实例和区别
May 28 Python
python开发之函数定义实例分析
Nov 12 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
Python设计模式之命令模式简单示例
Jan 10 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
python获取代码运行时间的实例代码
Jun 11 Python
Python数据可视化:饼状图的实例讲解
Dec 07 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
Jan 22 Python
TensorFlow2.0矩阵与向量的加减乘实例
Feb 07 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
python引入其他文件夹下的py文件具体方法
May 23 Python
Python实现的tcp端口检测操作示例
Jul 24 #Python
python正则表达式之对号入座篇
Jul 24 #Python
Python 字符串与二进制串的相互转换示例
Jul 23 #Python
Python二进制串转换为通用字符串的方法
Jul 23 #Python
Python基于多线程实现ping扫描功能示例
Jul 23 #Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 #Python
python定向爬虫校园论坛帖子信息
Jul 23 #Python
You might like
PHP与javascript的两种交互方式
2006/10/09 PHP
mysql+php分页类(已测)
2008/03/31 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
Python标准库与第三方库详解
2014/07/22 Python
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
Python算法应用实战之队列详解
2017/02/04 Python
详解python3中的真值测试
2018/08/13 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
2014年社区学雷锋活动总结
2014/03/09 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
工程造价专业求职信
2014/07/17 职场文书
合作协议书范文
2014/08/20 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
Win11更新失败并提示0xc1900101
2022/04/19 数码科技