初试API(数据库操作接口CRUD)

现在我们进入交互式python命令行,尝试一下django为你创建的各种API,通过以下命令打开python命令行:

py -3 manage.py shell进入python命令行

D:\django\mysite>py -3 manage.py shell

Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

(InteractiveConsole)

我们使用这个命令而不是简单的使用”python”是因为manage.py会设置DJANGO_SETTINGS_MODULE环境变量,这个变量会让django根据mysite/settings.py文件来设置python包的导入路径

当我们成功进入命令行后,来试试database API:

命令行下初始化模型类并查询:

#导入模型类

>>> from polls.models import Choice, Question

#查询模型类数据

>>> Question.objects.all()

<QuerySet []>

#创建Question类对象

#在django的默认配置文件中,时区time zones已经被启用

#pub_date字段需要待时区信息(tzinfo)的时间,所以要使用timezone.now(),而不是

#datetiem.datetime.now(),这方便于进行时区的切换后时间的展示

>>> from django.utils import timezone

>>> q = Question(question_text="What's new?", pub_date=timezone.now())

>>> q.save()

>>> q.id

1

>>> q.question_text

"What's new?"

>>> q.pub_date

datetime.datetime(2019, 10, 4, 10, 4, 45, 113879, tzinfo=<UTC>)

>>> q.pub_text = "What's up?"

>>> q.save()

>>> Question.objects.all()

<QuerySet [<Question: Question object (1)>]>

>>>

<Question: Question object (1)>对于我们了解这个对象的细节没什么帮助。让我们通过编辑question模型的代码(polls/models.py中)来修复这个问题。

给Question和Choice增加__str__()方法。

给模型添加__str__()方法

polls/models.py:

 

from django.db import models

# Create your models here.

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published') def __str__(self):
return self.question_text class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0) def __str__(self):
return self.choice_text

给模型增加__str__()方法很重要,这不仅仅能给你在命令行里使用带来方便,django自动生成的admin里也使用这个方法表示对象。

注意:这些都是常规的python方法,让我们添加一个自定义的方法,进行演示:

from django.db import models
from django.utils import timezone
import datetime
# Create your models here. class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published') def __str__(self):
return self.question_text def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

新加入的import datetime和from django.utils import timezone分别导入了python的标准datetime模块和django中和时区相关的django.utils.timezone工具模块。

保存文件然后通过python manage.py shell命令再次打开python交互命令行:

再次查询

>>> from polls.models import Choice, Question

#查询Question类所有对象,查看__str__()是否起作用

Question.objects.all()查询所有Question对象

>>> Question.objects.all()

<QuerySet [<Question: What's new?>]>

Question.objects.filter(id=1)查询id为1的

>>> Question.objects.filter(id=1)

<QuerySet [<Question: What's new?>]>

Question.objects.filter(question_text__startswith='What')查询前缀是What的

#startswith前面是两个下划线

>>> Question.objects.filter(question_text__startswith='What')

<QuerySet [<Question: What's new?>]>

from django.utils import timezone引入时区对象   

>>> from django.utils import timezone

>>> current_year = timezone.now().year

>>> current_year

2019

Question.objects.get(pub_date__year=current_year)

#查找发布时间是今年的问题

>>> Question.objects.get(pub_date__year=current_year)

<Question: What's new?>

Question.objects.get(id=2)按id查询

#查找没有的会报错

>>> Question.objects.get(id=2)

Traceback (most recent call last):

polls.models.Question.DoesNotExist: Question matching query does not exist.

django提供主键查询的缩写格式pk=1

Question.objects.get(pk=1)

#

>>> Question.objects.get(pk=1)

<Question: What's new?>

>>> q = Question.objects.get(pk=1)

q.was_published_recently()调用实例方法

>>> q.was_published_recently()

True

q.choice_set.create()给question对象添加choice关系对象

我们给question对象添加几个Choice类的关系对象。

q.choice_set.create()中的create方法构造一个新的Choice实例对象,操作insert语句,把Choice实例对象添加到可用的choice对象的集合中,并返回新的Choice实例对象

django会创建一个集合,这个集合用来存储外键关系的”另一侧”的对象,例如question对象的关系的另一侧:choice(选项),之后就可以通过数据库操作API访问到这个写关系对象

q.choice_set.all()查看question的choice选项,用choice_set返回QuerySet对象,可以继续操作查询

#开始时choice关系对象是空

>>> q.choice_set.all()

<QuerySet []>

创建三个choice关系对象

>>> q.choice_set.create(choice_text='Not much', votes=0)

<Choice: Not much>

>>> q.choice_set.create(choice_text='The sky', votes=0)

<Choice: The sky>

>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)

c.question查看choice对象的question关系对象

>>> c.question

<Question: What's new?>

#再次查询question对象的choice关系对象

>>> q.choice_set.all()

<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

q.choice_set.count()查看关系对象的数量

>>> q.choice_set.count()

3

API会按照你的需要自动的处理关联关系,使用双下划线分隔关系,你想要多少层就可以有多少层,没有限制

下面的例子是找到选项(choice)对应的所有问题,筛选其中发布日期是在今年的所有对象

重用在上面建的current_year变量

c.delete()删除对象

Choice.objects.filter(question__pub_date__year=current_year)

>>> Choice.objects.filter(question__pub_date__year=current_year)

<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')

>>> c

<QuerySet [<Choice: Just hacking again>]>

>>> c.delete()

(1, {'polls.Choice': 1})

>>> c

<QuerySet []>

>>> q.choice_set.all()

<QuerySet [<Choice: Not much>, <Choice: The sky>]>

>>> Choice.objects.all()

<QuerySet [<Choice: Not much>, <Choice: The sky>]>

>>>

timezone.now()

>>> timezone.now()

datetime.datetime(2019, 10, 5, 2, 20, 10, 762960, tzinfo=<UTC>)

>>> tz = timezone.now()

tz.year

>>> tz.year

2019

tz.month

>>> tz.month

10

tz.day

>>> tz.day

5

tz.hour

>>> tz.hour

2

tz.minute

>>> tz.minute

20

tz.second

>>> tz.second

22

tz.tzinfo

>>> tz.tzinfo

<UTC>

django学习-数据库操作接口API--(CRUD)的更多相关文章

  1. Django 2.0 学习(16):Django ORM 数据库操作(下)

    Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...

  2. Django 2.0 学习(14):Django ORM 数据库操作(上)

    Django ORM 数据库操作(上) ORM介绍 映射关系: 数据库表名 ---------->类名:数据库字段 ---------->类属性:数据库表一行数据 ----------&g ...

  3. django models 数据库操作

    django models 数据库操作 创建模型 实例代码如下 from django.db import models class School(models.Model): pass class ...

  4. Django与数据库操作

    Django与数据库操作 数据库连接的方法 web 框架 django --- 自己内部实现 (ORM) + pymysql(连接) Flask,tornado --- pymysql SQLArch ...

  5. Vue学习笔记-Django REST framework3后端接口API学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  6. Django模型-数据库操作

    前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...

  7. django中数据库操作——in操作符

    django一对多关系中,为了实现按照一端查询多端,之前都是用extra操作符,经过查看官方文档还有in这个操作符,用这个实现更简单.直接上代码: 根据查询条件模糊查询所有符合条件的机架列表,然后根据 ...

  8. 03: Django Model数据库操作

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  9. Django学习-7-ORM操作

    select * from tb where id > 1    # 对应关系     models.tb.objects.filter(1id__gt=)         models.tb. ...

随机推荐

  1. RPC调用和HTTP调用的区别

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...

  2. 题解 P2719 【搞笑世界杯】

    其实懂了之后很简单,但是刚开始真的很难想.. d[a][b]表示剩a张A类票和b张B类票时,最后两张票相同的概率 那么此时的排队的第一个人只有两种选择 拿A类票或者B类票 抛硬币得到的可能性当然是二分 ...

  3. stm32按键配置

    前言:我们都知道开发板上除了有经典的流水灯之外,还有一个必备的练习硬件--按键(key),下面继续来完成按键的配置. 1.通过查看原理图,找出按键(key)的管脚名字和对应芯片上的I/O口,四个I/O ...

  4. 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

    前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...

  5. spring cloud 与spring boot 版本不匹配引发的问题总结

    为了将前期项目慢慢转移到微服务上,今天开始搭建eureka服务时,出现以下错误: org.springframework.context.ApplicationContextException: Un ...

  6. CSS3 clip裁剪动画

    CSS3 clip裁剪动画 下面是比较简单的例子 <pre><html><head><style type="text/css">i ...

  7. python 多进程和多线程对比

    1. 对于耗费CPU的操作来说,多进程优于多线程 2. 对于耗费IO操作来说,多线程优于多进程 3. 多进程切换代价大于多线程

  8. 一致性hash应用-分表扩容

    之前给项目里的一个5000多万的表做了水平分表,暂时容量还够,用的根据id一致性hash分了32个表,每个表大概百来万数据.虽然还不需要扩容,但是准备写个demo后续如果需要扩容可以参考 hash方法 ...

  9. DVWA-CSRF学习笔记

    DVWA-CSRF学习笔记 一.CSRF(跨站请求伪造) CSRF(跨站请求伪造),是指利用受害者尚未失效的身份认证信息(cookie.session会话等),诱骗其点击恶意链接或者访问包含攻击代码的 ...

  10. Could not find resource——mybatis 找不到映射器xml文件

    今天用IDEA写Mybatis的时候,测试报了如图所示的错,恶心死我了,后来解决了,总结一下,防止下回跳坑,当然,也是做一个分享,如果有朋友遇到这个错,希望有所帮助 Error parsing SQL ...