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 ...
随机推荐
- phpstorm----------phpstorm2017基本使用
1.关闭2017版本的,函数参数提示.关闭方式如下: 2.如何设置代码里面的变量等号对齐,和key => value 对齐 ctrl+alt+l 3.修改PHP文件类创建的默认注释 4. ...
- input file 上传 判断文件类型、路径是否为空
<html> <body bgcolor="white"> <TABLE cellSpacing=0 cellPadding=0 width=&quo ...
- VCS
timing check相关的, +notimingcheck命令,可以用在compile时,也可以用在run time的时候, 都是将检查timing的系统函数,都disable掉了, 加在comp ...
- 移动端picker插件
项目需要,要做移动端网页,比如选择出生日期什么的.可笑weui给的控件,竟然选择后的数据不准确. 于是自己写了一个. 链接: https://pan.baidu.com/s/1qY2SSxQ 密码: ...
- 【 剑指Offer 1 】数据结构
数据结构是技术面试中的重点,总结以下几种常见的必须熟练掌握数据结构. 数组 字符串 链表 树 栈和队列 数组和字符串是两种最基本的数据结构,连续内存: 链表和树是面试中出现频率最高的: 栈与递归密切相 ...
- nginx配置优化 第二章
一:常用功能优化: 1:网络连接的优化: 只能在events模块设置,用于防止在同一一个时刻只有一个请求的情况下,出现多个睡眠进程会被唤醒但只能有一个进程可获得请求的尴尬,如果不优化,在多进程的ngi ...
- CSS hover
CSS hover hover 鼠标移动到当前标签上时,以下css属性才能生效 <!DOCTYPE html> <html lang="en"> <h ...
- 剑指offer(59)按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目分析 这道题还是需要画图分析,不然不好找 ...
- loj#3 -Copycat
原题链接:https://loj.ac/problem/3 题目描述: --- Copycat 内存限制:256 MiB 时间限制:1000 ms 输入文件: copycat.in 输出文件: cop ...
- 使用vue.js + laravel开发单页面应用
最近学了vuejs和laravel,然后顺便就撸了简单的demo,这里将会根据这个demo介绍下如何使用vuejs+laravel开发一个简单的单页面应用,demo的github地址是https:// ...