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--基础查询的更多相关文章

  1. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  2. Django 07 Django模型基础2 (常用查询和多表关联)

    Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...

  3. 【Python全栈-后端开发】Django入门基础

    Django基础知识 一. 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的 ...

  4. Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)

    Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...

  5. Django 【基础篇】

    前戏 python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #cod ...

  6. 巩固复习(Django最基础的部分_具体查看官方文档)

    Django学习路1 1.脚本不能随便运行,没准 linux 运行完就上不去了 2.pip 在 linux 上 写 pip3 同理 python 写为 python3 3.在 pycharm 上安装库 ...

  7. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  8. Django QuerySet API文档

    在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据 ...

  9. 合并多个python list以及合并多个 django QuerySet 的方法

    在用python或者django写一些小工具应用的时候,有可能会遇到合并多个list到一个 list 的情况.单纯从技术角度来说,处理起来没什么难度,能想到的办法很多,但我觉得有一个很简单而且效率比较 ...

  10. Django中Q查询及Q()对象

    问题 一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码: >>> q1 = Entry.objects.filter(headline__st ...

随机推荐

  1. HBase笔记5(诊断)

    阻塞急救: RegionServer内存设置太小: 解决方案: 设置Region Server的内存要在conf/hbase-env.sh中添加export HBASE_REGIONSERVER_OP ...

  2. Gradle引人注目的特性集

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言限于Java. ...

  3. 158A Next Round

    A. Next Round time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  4. 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合

    package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...

  5. flutter stack

    import 'package:flutter/material.dart'; void main() { runApp(MaterialApp(home: new MyApp())); } clas ...

  6. 安装Joomla!3

    在日常测试中搭建一个web 站点进行进行linux 相关功能测试,只是不喜欢httpd 或者nginx 的默认界面: 安装Joomla!3: 系统:centos 7 软件:  连接: https:// ...

  7. Python爬虫(四)——豆瓣数据模型训练与检测

    前文参考: Python爬虫(一)——豆瓣下图书信息 Python爬虫(二)——豆瓣图书决策树构建 Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析 数据的构建 在这张表中我们可以发现 ...

  8. nrm 安装与使用

    1.使用 npm install nrm -global 全局安装 2.安装完成后使用 nrm ls命令查看其维护的镜像地址列表 3.* 星号表示在使用 npm下载资源的时候,默认使用的地址 这里需要 ...

  9. docker启动容器报错: could not synchronise with container process: not a directory

    错误现象 在运行容器时,出现以下错误 [root@localhost test]# docker run -it -d -v $PWD/test.txt:/mydir mytest fd44cdc55 ...

  10. day02编程语言,Python语言介绍,Python解释器安装,环境变量,Python代码执行,pip,应用程序使用文件的三步骤,变量,变量的三大组成,比较,pycharm

    复习 重点: 1.进制转换:二进制 与十六进制 2.内存分布:栈区 与堆区 # 二进制1111转换十六进制 => 8 4 2 1 => f 10101100111011 => 2a7 ...