Django--QuerySet--基础查询
Django--QuerySet--基础查询
创建模型类:
from django.db import models # Create your models here. class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField() def __str__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField() def __str__(self):
return self.name class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
n_comments = models.IntegerField()
n_pingbacks = models.IntegerField()
rating = models.IntegerField() def __str__(self):
return self.headline
对数据库的迁移生成数据表:
| queryset_demo_author |
| queryset_demo_blog |
| queryset_demo_entry |
| queryset_demo_entry_authors | # 在模型类中我们使用了 多对多所以系统会自动的为我们创建了一个表。
+-----------------------------+
queryset_demo_entry_authors表结构
mysql> desc queryset_demo_entry_authors;
+-----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| entry_id | int(11) | NO | MUL | NULL | |
| author_id | int(11) | NO | MUL | NULL | |
+-----------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
使用shell 进行对数据库的测试:
save()
(venv) lee@lee:~/PycharmProjects/Djdemo/djdemo$ python manage.py shell # 执行shell
>>> from queryset_demo.models import Blog,Author,Entry # 导入所需要得类
>>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.') # 创建对象
>>> b.save() # 存入数据库
对数据库进行查询:
mysql> select * from queryset_demo_blog;
+----+--------------+------------------------------+
| id | name | tagline |
+----+--------------+------------------------------+
| 1 | Beatles Blog | All the latest Beatles news. |
+----+--------------+------------------------------+
1 row in set (0.01 sec)
数据库查询
creat()
>>> crete_demo = Blog.objects.create(name='create_test',tagline='This is the wayof create')
# 数据库得查询 mysql> select * from queryset_demo_blog;
+----+--------------+------------------------------+
| id | name | tagline |
+----+--------------+------------------------------+
| 1 | Beatles Blog | All the latest Beatles news. |
| 2 | create_test | This is the wayof create |
+----+--------------+------------------------------+
create()
在数据库中已经存在的数据进行属性的修改:
>>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
>>> b.save() >>> b.name
'Beatles Blog' >>> b.name = 'change_new_name' # 对属性的值进行修改
>>> b.name
'change_new_name'
>>> b.save() # 将修改的值存储到数据库中 mysql> select * from queryset_demo_blog;
+----+-----------------+------------------------------+
| id | name | tagline |
+----+-----------------+------------------------------+
| 1 | change_new_name | All the latest Beatles news. |
| 2 | create_test | This is the wayof create |
+----+-----------------+------------------------------+
2 rows in set (0.00 sec)
注意:
1. 必须是在数据库中存在的数据。
2.当我们获取到属性的时候,进行修改后,必须执行save()方法才能重新的存入到数据库中。
ForeignKey字段的更新:
数据库文件的添加:
mysql> select * from queryset_demo_author;
+----+-------+---------------+
| id | name | email |
+----+-------+---------------+
| 1 | Tom | Tom@123.com |
| 2 | Jone | jone@123.com |
| 3 | Kevin | kevin@123.com |
+----+-------+---------------+
3 rows in set (0.00 sec) mysql> select * from queryset_demo_blog;
+----+-----------------+------------------------------+
| id | name | tagline |
+----+-----------------+------------------------------+
| 1 | change_new_name | All the latest Beatles news. |
| 2 | create_test | This is the wayof create |
| 3 | Cheddar Talk | One to Many test |
| 4 | blog_3 | this is a test |
+----+-----------------+------------------------------+
4 rows in set (0.00 sec) mysql> select * from queryset_demo_entry;
+----+----------+----------------+------------+------------+------------+-------------+--------+---------+
| id | headline | body_text | pub_date | mod_date | n_comments | n_pingbacks | rating | blog_id |
+----+----------+----------------+------------+------------+------------+-------------+--------+---------+
| 1 | python | This is a demo | 2018-07-11 | 2018-07-14 | 10 | 29 | 23 | 2 | # 稍后我们将进行一个修改
+----+----------+----------------+------------+------------+------------+-------------+--------+---------+
1 row in set (0.00 sec)
对一对多的字段进行更新:
需求让Entry的表id = 1 的数据和 Blog id = 4 进行关联
>>> from queryset_demo.models import Blog,Entry,Author
>>> entry = Entry.objects.get(pk=1) # 数据库中只有一条数据
>>> entry
<Entry: python> # 返回一个对象 >>> entry.blog
<Blog: create_test> # 通过属性获得我们关联的一个对象 >>> entry.blog.tagline
'This is the wayof create' # 获取关联对象的属性 >>> change_bolg_3 = Blog.objects.get(pk=4) # 创建我们想要更新的对象 >>> entry.blog = change_bolg_3
>>> entry.save() >>> entry.blog = change_bolg_3 # 跟新我们的关联
>>> entry.save() # 存储到数据库 对数据库查询验证
>>> entry = Entry.objects.get(pk=1)
>>> entry
<Entry: python>
>>> entry.blog
<Blog: blog_3> mysql> mysql> select * from queryset_demo_entry;
+----+----------+----------------+------------+------------+------------+-------------+--------+---------+
| id | headline | body_text | pub_date | mod_date | n_comments | n_pingbacks | rating | blog_id |
+----+----------+----------------+------------+------------+------------+-------------+--------+---------+
| 1 | python | This is a demo | 2018-07-11 | 2018-07-14 | 10 | 29 | 23 | 4 |
+----+----------+----------------+------------+------------+------------+-------------+--------+---------+
1 row in set (0.00 sec)
ManyToManyField的更新:
需要注意的地方在创建模型类的时候我们知道当字段出现多对多的对应关系的时候那么djnago会在系统中给给我们默认的生成一张关系表。
>>> john = Author.objects.create(name="John")
>>> paul = Author.objects.create(name="Paul")
>>> entry.authors.add(john,paul) # 可以同时添加多个 entry中的authors字段 数据库中进行插叙 mysql> select * from queryset_demo_author;
+----+-------+---------------+
| id | name | email |
+----+-------+---------------+
| 1 | Tom | Tom@123.com |
| 2 | Jone | jone@123.com |
| 3 | Kevin | kevin@123.com |
| 4 | Joe | |
| 5 | John | |
| 6 | Paul | |
+----+-------+---------------+
6 rows in set (0.00 sec) mysql> select * from queryset_demo_entry_authors;
+----+----------+-----------+
| id | entry_id | author_id |
+----+----------+-----------+
| 1 | 1 | 2 |
| 2 | 1 | 4 |
| 3 | 1 | 5 |
| 4 | 1 | 6 |
+----+----------+-----------+
4 rows in set (0.00 sec)
Django--QuerySet--基础查询的更多相关文章
- Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)
Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...
- Django 07 Django模型基础2 (常用查询和多表关联)
Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...
- 【Python全栈-后端开发】Django入门基础
Django基础知识 一. 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的 ...
- Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)
Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...
- Django 【基础篇】
前戏 python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #cod ...
- 巩固复习(Django最基础的部分_具体查看官方文档)
Django学习路1 1.脚本不能随便运行,没准 linux 运行完就上不去了 2.pip 在 linux 上 写 pip3 同理 python 写为 python3 3.在 pycharm 上安装库 ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- Django QuerySet API文档
在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据 ...
- 合并多个python list以及合并多个 django QuerySet 的方法
在用python或者django写一些小工具应用的时候,有可能会遇到合并多个list到一个 list 的情况.单纯从技术角度来说,处理起来没什么难度,能想到的办法很多,但我觉得有一个很简单而且效率比较 ...
- Django中Q查询及Q()对象
问题 一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码: >>> q1 = Entry.objects.filter(headline__st ...
随机推荐
- 浏览器 User-Agent相关知识
文章引用链接 http://www.360doc.com/content/12/1012/21/7662927_241124973.shtml
- 以选项卡的故事扯扯js面向对象
在现在的网页中,选项卡(我自己这样子叫)是非常普遍的,也是比较基础,学了原型实现选项卡也挺久了,最近在学ES6,学了用类实现选项卡,今天就在此做个总结,别的废话也不多说. 以"貌" ...
- Divide the Sequence (贪心)
题意:求将一串数据尽可能多分成所有前缀和大于0的连续子串. 思路:由于是要求所有前缀和大于0,那么只要从后往前推就好了. #include<bits/stdc++.h> using nam ...
- 记录Ok6410 sd 启动uboot
1\参考资料https://github.com/SeanXP/ARM-Tiny6410/tree/master/no-os/sd-no-os/u-boot 2\参考资料https://blog.cs ...
- Bugku-CTF之管理员系统+程序员本地网站
Day12 管理员系统 http://123.206.31.85:1003/ flag格式flag{}
- vector和list
vector vector与数组类似,拥有一段连续的内存空间,并且起始地址不变.便于随机访问,时间复杂度为O(1),但因为内存空间是连续的,所以在进入插入和删除操作时,会造成内存块的拷贝,时间复杂度为 ...
- Bootstrap3基础 table-bordered/hover 表格加外边框和鼠标悬停对应行的背景色加深
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- .Net 读取配置文件 xml
直接解析XML文件 1.System.Xml.Linq命名空间下提供可以使用linq查询的类,使用linq to xml读取也很方便. 2.还可以使用System.Xml.Serialization类 ...
- Linux中通过Socket文件描述符寻找连接状态介绍
针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...
- OC的反射机制
反射机制主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法.对于人一个对象,都能够调用这个对象的任意方法和属性.这种 ...