Django的models介绍
我们一般会在创建表的类中写一个__str__方法,就会为为了打印这个对象不会打印一大堆的对象的内存地址,而是我们想要他返回的信息,方便我们更直观的知道这个对象是谁,方便显示。比如下面的例子
- from django.db import models
- # Create your models here.
- class userInfo(models.Model):
- # userInfo其实就是数据中表的内容
- username = models.CharField(max_length=64)
- age = models.CharField(max_length=64)
- sex = models.CharField(max_length=64)
- def __str__(self):
- return self.username
下面我们正式进入models的学习
一、学习字段。通过models来调用各种字段
- class userInfo(models.Model):
- # userInfo其实就是数据中表的内容
- username = models.CharField(max_length=64)
- # CharField:存放较短的字符串的
- price = models.IntegerField(null=True)
- # IntegerField:存放数字的
- age = models.CharField(max_length=64)
- sex = models.CharField(max_length=64)
- add = models.TextField(max_length=128)
- # TextField:存放较长数字的
- def __str__(self):
- return self.username
首先在project的settings中标明为哪个app创建表
然后后执行命令
python manager.py makemigrations 生成配置文件
python manager.py migrate 根据配置文件生成表
- E:\python\django_project_test1>python manage.py makemigrations
- Migrations for 'test1_app1':
- test1_app1\migrations\0001_initial.py
- - Create model person
- E:\python\django_project_test1>python manage.py migrate
- Operations to perform:
- Apply all migrations: admin, auth, contenttypes, sessions, test1_app1
- Running migrations:
- Applying contenttypes.0001_initial... OK
- Applying auth.0001_initial... OK
- Applying admin.0001_initial... OK
- Applying admin.0002_logentry_remove_auto_add... OK
- Applying contenttypes.0002_remove_content_type_name... OK
- Applying auth.0002_alter_permission_name_max_length... OK
- Applying auth.0003_alter_user_email_max_length... OK
- Applying auth.0004_alter_user_username_opts... OK
- Applying auth.0005_alter_user_last_login_null... OK
- Applying auth.0006_require_contenttypes_0002... OK
- Applying auth.0007_alter_validators_add_error_messages... OK
- Applying auth.0008_alter_user_username_max_length... OK
- Applying sessions.0001_initial... OK
- Applying test1_app1.0001_initial... OK
- E:\python\django_project_test1>
单表的操作
1、插入数据,然后在视图函数中为表插入信息,可以使用create和save的方式,但是我们这里只掌握create方式吧
下面是通过字段的方式插入数据
- models.userInfo.objects.create(
- username = username_new,
- age = age_new,
- sex = sex_new
- )
我们还可以通过两个*号加字典的方式传递,主要是使用第二种方法,因为我们从前端一般拿到的数据就是一个字典
- test_dic= {"usernmae":username_new,"age":age_new,"sex":sex_new}
- models.userInfo.objects.create(**test_dic)
2、删除数据,通过filter方法找到数据,然后调用delete方法删除数据即可
- models.userInfo.objects.filter(id=1).delete()
3、修改数据,通过update和save两种方法可以获取
先介绍下save方法,先通过get获取到数据库中的数据,然后修改数据,然后调用save方法保存数据,通过get方法拿到的对象是一个单个对象
- auther = models.userInfo.objects.get(id=5)
- auther.name = "xxxx"
- auther.save()
在来看下update方法,先通过filter找到要修改的数据,然后通过update方法更改数据,这里要说明,这里必须filter,filter拿到的一个对象集合,且upate的方法必须对一个对象集合做操作,而不能使用get方法,这里说的集合就是个列表
- models.userInfo.objects.filter(id=5).update(name="xxxxx")
4、在来看下查
先来介绍下filter方法,通过过滤多个字段属性的来查询数据,查询符合条件的结果,拿到的结果对象是一个list
- models.userInfo.objects.filter(**{"username":"alex","age":23})
- models.userInfo.objects.filter(**{"username":"alex","age":23}).values("name")
在来看下all方法,查询所有的结果,all里面有参数,难道的结果对象是一个list
- user_list = models.userInfo.objects.all()
在来看下exclude方法,这个对取反,取出哪些不符合这些这条件的数据
- models.userInfo.objects.exclude(**{"username":"alex","age":23})
在看来下distinct,对拿到的数据进行去重
- models.userInfo.objects.distinct(**kwargs)
count方法:获取查询到对象的数量
first方法:返回第一条记录
last方法:放回最后一条记录
exists():判断是否存在某个数据
order_by():排序
多表的操作之一对多
一、先来看下如果创建一对多,比如我们下面的例子,我们创建一个person表,这个表中有一个字段叫school,那么一个人只能对应一个学校,而一个学校可以对应多个人,那么
这个一就是学校,多就是人,我们在创建表的时候,需要在多的表里创建外键关系,比如下面的例子这一句就是外键关系,实现一对多的效果
- school = models.ForeignKey("school")
- class userInfo(models.Model):
- # userInfo其实就是数据中表的内容
- username = models.CharField(max_length=64)
- # CharField:存放较短的字符串的
- price = models.IntegerField(null=True)
- # IntegerField:存放数字的
- age = models.CharField(max_length=64)
- sex = models.CharField(max_length=64)
- add = models.TextField(max_length=128)
- school = models.ForeignKey("school")
- # TextField:存放较长数字的
- def __str__(self):
- return self.username
那么如果是一个一对多的表,我们如何插入一个数据呢?我们这里有虽然school这列对应的值是school-id,所有我们在插入数据的时候直接school_id = 2就可以了
或者我们也可以通过filter方式查询到指定的school表的某一个行,然后让school = school[0]来设置值
下面我们看下一个例子
首先在models文件中创建两张表,其中user_info表中的user_sch和school表是外键关系,一个学生只能对应一个学校,一个学校中可以有多个学生,所以学生属于多,在ForeignKEey写在user_info表中,对关联school表
- from django.db import models
- # Create your models here.
- class user_info(models.Model):
- user_name = models.CharField(max_length=64)
- user_pwd = models.CharField(max_length=64)
- user_age = models.IntegerField(max_length=32)
- user_sex = models.CharField(max_length=32)
- # user_sch = models.CharField(max_length=44)
- user_sch = models.ForeignKey("school")
- def __str__(self):
- return self.user_name
- class school(models.Model):
- school_name = models.TextField(max_length=128)
- school_address = models.TextField(max_length=128)
- school_level = models.CharField(max_length=32)
- def __str__(self):
- return self.school_name
我们在看下我们的前端的页面
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>注册用户</title>
- <style>
- h3{
- color: red;
- font-weight: bold;
- }
- </style>
- </head>
- <body>
- <form action="/app1/test1/" method="post">
- <h3>基本用户信息</h3>
- 用户:<input type="text" name="user_name">
- <br/>
- 密码:<input type="password" name="user_passwd">
- <br/>
- 年龄:<input type="text" name="user_age">
- <br/>
- 学校:<input type="text" name="user_school">
- <h3>性别</h3>
- 男:<input type="radio" name="sex" value="man">
- 女:<input type="radio" name="sex" value="wom">
- {# <br/>#}
- <h3>-------------------------------------------------------------------------</h3>
- <input type="submit" value="提交">
- </form>
- <h3>-------------------------------------------------------------------------</h3>
- <h3>信息展示</h3>
- <table border="1">
- <caption>展示用户信息</caption>
- <thead>
- <tr>
- <th>姓名</th>
- <th>密码</th>
- <th>性别</th>
- <th>年龄</th>
- <th>学校</th>
- </tr>
- </thead>
- <tbody>
- {% for i in user_list %}
- <tr>
- <td>{{ i.user_name }}</td>
- <td>{{ i.user_pwd }}</td>
- <td>{{ i.user_sex }}</td>
- <td>{{ i.user_age }}</td>
- <td>{{ i.user_sch }}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </body>
- </html>
我们重点看下如何插入ForieginKey这一列的数据
- from django.shortcuts import render
- from django_models_app1 import models
- from django.shortcuts import HttpResponse
- # Create your views here.
- def test1(request):
- # print(request.method)
- if request.method.lower() == "post":
- input_name = request.POST.get("user_name")
- input_pwd = request.POST.get("user_passwd")
- input_sex = request.POST.get("sex")
- input_age = request.POST.get("user_age")
- input_sch = request.POST.get("user_school")
- print(input_sch,"-----------------------------")
- school_id = models.school.objects.filter(id=1)
- print(school_id[0].id)
- print("school_id",school_id,sep="-------------------------------------------")
- models.user_info.objects.create(
- user_name = input_name,
- user_pwd = input_pwd,
- user_age = input_age,
- user_sex = input_sex,
- user_sch = school_id[0]
- )
- user_list = models.user_info.objects.all()
- return render(request, "register.html",{"user_list":user_list})
- else:
- # models.user_info.objects.filter(id=7).update(user_name="崔熙雯")
- # models.user_info.objects.filter(id=8).delete()
- models.user_info.objects.all().delete()
- return render(request,"register.html")
- def school(request):
- if request.method.lower() == "post":
- school_name = request.POST.get("school_name")
- school_address = request.POST.get("school_address")
- school_level = request.POST.get("school_level")
- print(school_name)
- models.school.objects.create(
- school_name = school_name,
- school_address = school_address,
- school_level = school_level
- )
- return render(request, "school.html")
- else:
- return render(request,"school.html")
我们不仅仅可以通过id查找外键关系,还可以使用其他字段,下面的例子就是用name来查找外键关系
- school_id = models.school.objects.filter(school_name=input_sch)
- print(school_id[0].id)
- print("school_id",school_id,sep="-------------------------------------------")
- models.user_info.objects.create(
- user_name = input_name,
- user_pwd = input_pwd,
- user_age = input_age,
- user_sex = input_sex,
- user_sch = school_id[0]
- )
我们在前端输入指定的学校的名称,他会通过学校的名称来自动关联学校的id
多表的操作之多对多,在任意一张表创建均可以,比如一个作者可以写多本书,而一本书也可能有多个作者,所以这里是多对多的关系,django会自动为什么创建第三表,保存book_id和publish_id的映射关系
- language = models.ManyToManyField("Country")
先通过filter获取两个作者的对象,然后在书的表中为auther这个属性添加获取到的两个作者的对象即可
- book.auther.add(auther1,auther2)
多对多的操作,第三种表是django自动创建的,比如我们的例子,一个user_info表和course表,user_info和course中的字段不存在任何这2张表中,他存在于第三张表
绑定关系用add方法
取消绑定用remove方法
多对多还是比较复杂的,我们在从头开始捋一捋
1、多对多只需要在一张表中设置就可以了,不需要在两张表设置。我们的例子是这样的,用户表和课程表,这2张表是多对多关系的,我们先来看两种的字段
用户表,我们在用户表有关联到课程表,且用ManyToManyField来关联
我们在来看下课程表,课程表中仅仅只有一个字段,就是课程的名称,和用户没有任何关系
2、表的类创建成功后,我们就执行命令初始化表
python manage.py makemigrations
python manage.py migrate
我们来看下数据库中的表的内容,先看用户表,他的表中也和课程表没有任何关系
我们在看下课程表,课程表和用户没有任何关系
那么用户和课程该怎么关联起来呢?这个时候就需要用到第三表,第三表是由Django自动为我们创建的
那么我们就来看下第三表。我们看到在第三表中,关联了用户和课程的信息
2、表已经创建成功了,下面我们来看下如何插入数据,插入数据也是用add方法
首先我们看下用户表插入数据的代码,分为两部分,第一部分是下面的内容,但是不包括多对多的项,因为我们在上面也看到,在用户表中压根就没有课程这一列
然后我们在看客户插入数据的代码,同样,也仅仅插入自己的信息,但是不包括多对多的项,因为我们在上面也看到,在课程表中压根中没有用户这一列
最后我们在往第三表中插入数据,第三表是django默认创建的,所以我们不需要通过表明去插入数据,我们在用户表的视图函数为第三表中插入数据
我们需要解释一下上面的代码
第一句:先找到用户表中, 未哪个用户添加课程信息,也就是用户对象
第二句:然后找到课程,也就是我们要为第一句的用户添加的课程的表对象
第三句:是错误的示范,我们不是为某张表添加课程,而是为某个用户添加课程对象
第四句:这个正确的示范,我们为某个用户添加课程数据,使用add方法
下面我们实际看下数据库中表的内容
先看用户表的信息,主要关注id的信息,周雍博的id为8
在来看下课程表,主要关注课程表的id信息,我们为周雍博这个用户添加的课程为大学体育,id为4
最后我们要看第三张表的内容
同样,如果删除,只需要把add替换为remove即可
多对多的第二种方法,上面的方法是django为我们创建表,我们还可以自己创建第三张表,作者这列一对多作者表,书这一列一对多书表,红色圈中的意思是联合唯一的意思
这个时候在往第三张表插入数据就需要我们自己做了,那么这个时候该如何插入呢?其实就用我们的前面讲的create方法来插入数据就可以了
这个时候就不需要在第一张表写ManyToManyField了
如果要删除数据的话,不仅仅book中的数据会被删除,book2auther表中的数据也会被删除
更改数据的方法也和之间一对多的场景的方法一样
Django的models介绍的更多相关文章
- Django中ORM介绍和字段及其参数
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中ORM介绍
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- Django 中 form 介绍
目录 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用 ...
- Django中ORM介绍和字段及字段参数
Object Relational Mapping(ORM) 1 ORM介绍 1.1 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对 ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- Django之Models进阶操作(字段属性)
字段属性详细介绍 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列, ...
- 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
- 八、Django之Models(译)
模型(Models) 模型是你的数据的唯一的.确定的信息源. 它包含你所储存数据的必要字段和行为. 通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是一个Python类,它们都是djang ...
- Django中ORM介绍和字段参数
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
随机推荐
- linux date -d参数用法
最近偶为了写一个调整时间的shell而绞尽脑汁,结果在某一天#info data这里面看到了data -d参数的灵活用法,真是欣喜若狂.好东西要保存,整理整理: * To print the date ...
- Spring mvc的web.xml配置详解
1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在web.xml配置监听器ContextLoaderListener(l ...
- 第10章 线程控制(5)_多线程下的fork
6. 线程和fork 6.1 多线程下的fork (1)历史包袱 ①fork与多线程的协作性很差,这是POSIX系统操作系统的历史包袱. ②长期以来程序都是单线程的,fork运行正常,但引入线程这后, ...
- 【C++11新特性】 auto关键字
原文链接: http://blog.csdn.net/xiejingfa/article/details/50469045 熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如pyt ...
- sencha touch 小米3无法点击问题 修复
修改源码文件夹下event/publisher/Dom.js中的attachListener方法,代码如下 attachListener: function(eventName, doc) { if ...
- position属性详解
内容: 1.position属性介绍 2.position属性分类 3.relative相对定位 4.absolute绝对定位 5.relative和absolute联合使用进行定位 6.fixed固 ...
- remove ubuntu lvm
sudo vgdisplay sudo vgremove groupname
- Javascript,获取元素,write方法
一:Javascript:弱类型脚本语言,是一种动态类型.实现部分动画效果和用户交互等 -- html是骨架(页面结构) css样式 js是行为 -- 弱类型体现: JS代码可以写在body,he ...
- PHP Token(令牌)设计 避免重复提交
设计目标: 避免重复提交数据. 检查来路,是否是外部提交 匹配要执行的动作(如果有多个逻辑在同一个页面实现,比如新增,删除,修改放到一个PHP文件里操作) 这里所说的token是在页面显示的时候,写到 ...
- 5. Java中序列化的serialVersionUID作用
Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法:为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判断 ...