ORM的模型类字段类型,字段选项,Meta类,管理器对象,创建数据,create(),Django Shell,查询数据,all(),values(),order_by(),values_list()

ORM的模型类字段类型

  1. BooleanField()

数据库类型为tinyint(1)
在编程语言中使用True和False来表示值
在数据库中用0和1来表示值

2.CharField()

数据库类型为varchar
参数:

max_length:字符的最大位数

注:该参数是必须值

3.DateField()

数据库类型为date
用来表示时间
参数:

auto_now:设置为True时,在每次保存时都会将变量的值设置为当前的时间


auto_now_add:设置为True时,只在第一次创建的时候设置当前时间,后序的添加和删除都不会更新时间
default:设置时间,为固定的一个字符串,为default设置的值例如('2021/9/18')则这个变量的值始终为这个固定的时间

注:以上的三个参数只能存在一个

4.DateTimeField()

类型为datetime(6)
表示时间,参数和DateFileld()一致

5.FloatField()

类型为double型

6.DecimalField()

数据库类型为decimal(x,y)
在编程中用小数来表示该值
数据库中也是小数
参数:

max_digits:总位数,包括小数点后面的位数


decimal_places:小数位数

注:这两个参数也是必须的

7.EmailField()

数据库类型为varchar
在djago中存储到数据库时,会进行正则的判断,如果不是Email类型的就不会存储到数据库中

8.IntergerField()

数据库类型为int型

9.ImageField()

数据库类型为varchar(100)
作用是存储图片的路径
django用字符串来表示该值

10.TextField()

数据库类型为longtext
用于存储不定长字符串

官方文档中还有很多类型,上述的是常用的一些类型
https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-types


例:
创建一个Author新表
属性中含有:
姓名 :varchar型,最大长度为20
年龄:int型
邮箱:varchar型


在bookstore这个应用中的models文件中,新创建一个类,叫做Author
class Author(models.Model):
    name = models.CharField('姓名',max_length=20,default='')
    age = models.IntegerField('年龄',default='')
    email = models.EmailField('邮箱',default='')

models文件中创建一个表,要包括
导入库 from django.db import models
一个类要继承models.Model

class 类名(models.Model):
	变量名 = models.字段名(字段选项)

其中的字段选项指的是指定创建类的额外信息
允许出现多个字段选项,中间要使用,隔开

字段选项参数
primary:如果设置为True,则表示该列为主键,如果所有的列中都不含有这个参数,django会创建一个新的id列为主键,默认为False


blank:设置为True,表示字段可以为空,为False表示非空,默认为False
null:设置为True,表示该列值允许为空,默认为False,如果此选项为False,建议加上default来填充默认参数值
default:设置列的默认值
db_index:设置为True,则表示改列增加索引
unique:设置为True,表示唯一键即不允许有重名的值出现
db_column:指定列的名称,如果不指定则使用属性名称为列名称
verbose_name:设置该字段在admin界面上显示名称

例:
创建一个属性,用户名称,最大长度为30,唯一键,添加索引,不允许为空,默认值设置为N/A

name = models.CharField(max_length=30,db_index=True,unique=True,null=False,default='')

Meta类的定义
使用内部类Meta来给模型赋予属性,Mete类下有很多内建的类属性,可以对模型类做一些控制
实例:

class Book(models.Model):
    title = models.CharField('书名', max_length=50, default='')  # 创建书名属性,最大长度为50,类型为char型
    price = models.DecimalField('价格', max_digits=7, decimal_places=2, default='')  # 创建价格属性,精度为7位,小数两位,类型为价格类型
    info = models.CharField('描述', max_length=100, default='')

    class Meta:
        db_table = 'book'# 修改模型的名称,原来的名称为app名称+类名称,设置该变量名称后,模型名称就为book,但是仍要进行makemigrating migrate

在这里插入图片描述
实现
在这里插入图片描述

from django.db import models


# Create your models here.


class Book(models.Model):
    title = models.CharField('书名', max_length=50,default='',unique=True)  # 创建书名属性,最大长度为50,类型为varchar型,唯一性
    pub = models.CharField('出版社',max_length=100,default='',null=Fasle) # 创建出版社属性,最大长度为100,类型为varchar,非空
    price = models.DecimalField('价格', max_digits=7, decimal_places=2,default=0.0)  # 创建价格属性,精度为7位,小数两位,类型为浮点类型
    mark_price = models.DecimalField('零售价',max_digits=7,decimal_places=2,default=0.0) # 创建零售价属性,精度为7,小数位数为2,类型为浮点型

    class Meta:
        db_table = 'book' # 将表名设置为book


class Author(models.Model):
    name = models.CharField('姓名', max_length=11,null=False,default='') # 创建姓名属性,长度为11,非空
    age = models.IntegerField('年龄', default=1) # 创建年龄属性,默认值为1
    email = models.EmailField('邮箱', null=True) # 创建邮箱属性,可以为空

    class Meta:
        db_table = 'author'

在这里插入图片描述
ORM操作
包括增删改查操作,即(CRUD操作)
核心是->模型类.管理器对象
管理器对象
每一个继承models.Model的类对象,都有一盒object对象同样被继承下来,他就是管理器对象
数据库的增删改查可以通过模型的管理器实现
创建数据
创建数据中每一条记录就是创建一个数据对象
方案一:

MyModel.object.create(属性1=值1,属性2=值2,属性3=值3…)
成功:返回创建好的对象
失败:抛出异常

方案二:

obj = MyModel(属性1=值1,属性2=值2) # 实例化一个对象
obj.属性3 = 值3
obj.save() # 只有调用.save()时才将数据传入到数据库

Django shell

Django提供的一个交互式的操作项目叫做Django Shell,他能够在交互模式用项目工程代码执行响应的操作 利用Djangoshell 可以代替编写view代码来进行直接的操作
注意项目代码发生变化的时候,要重新进入Django Shell

命令:python manage.py shell

方法一

In [1]: from bookstore.models import Book

In [2]: b1 = Book.objects.create(title='Python',pub='清华大学出版社',price=20,mark_price=25)

在这里插入图片描述

In [7]: obj = Book(title='Java',pub='电子科技大学出版社',price=25)

In [8]: obj.mark_price = 30

In [9]: obj.save()

在这里插入图片描述
查询数据
数据库的查询需要使用管理器对象进行
通过MyModel.object管理器对象调用查询方法进行
方法:

all():
用法:MyModel.objects.all()
等同于在数据库命令栏中的SELECT * from table
查询全部对象,返回QuerySet对象里面放的是类对象

In [22]: book = Book.objects.all()

In [23]: books = Book.objects.all()

In [24]: for book in books:
    ...:     print("书名为:",book.title,"出版社为:",book.pub)
    ...: 
书名为: Python 出版社为: 清华大学出版社
书名为: Java 出版社为: 电子科技大学出版社
书名为: Django 出版社为: 清华大学出版社
书名为: JQure 出版社为: 机械工业出版社
书名为: Linux 出版社为: 机械工业出版社
书名为: HTML5 出版社为: 清华大学出版社

In [25]: books
Out[25]: <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>, <Book: Book object (6)>]>



vlues(‘列1’,‘列2’…):
用法:MyModels.objects.values(…)
作用:查询部分列并返回字典数据对象
返回值:QuerySet内容为字典类型

In [26]: b2 = Book.objects.values('title','pub')

In [27]: b2
Out[27]: <QuerySet [{'title': 'Python', 'pub': '清华大学出版社'}, {'title': 'Java', 'pub': '电子科技大学出版社'}, {'title': 'Django', 'pub': '清华大学出版社'}, {'title': 'JQure', 'pu
b': '机械工业出版社'}, {'title': 'Linux', 'pub': '机械工业出版社'}, {'title': 'HTML5', 'pub': '清华大学出版社'}]>

values_list(‘列1’,‘列2’)
用法:MyModel.objects.values_list(…)
作用:查询部分列并返回元组对象
返回值:QuerySet内容为元组

In [3]: b1 = Book.objects.values_list('title','price')

In [4]: b1
Out[4]: <QuerySet [('Python', Decimal('20.00')), ('Java', Decimal('25.00')), ('Django', Decimal('70.00')), ('JQure', Decimal('90.00')), ('Linux', Decimal('80.00')), ('HTML5', Decimal
('90.00'))]>

In [5]: for i in b1:
   ...:     print(i)
   ...: 
('Python', Decimal('20.00'))
('Java', Decimal('25.00'))
('Django', Decimal('70.00'))
('JQure', Decimal('90.00'))
('Linux', Decimal('80.00'))
('HTML5', Decimal('90.00'))


order_by(‘列1’,‘列2’)
用法:MyModel.objects.order_by(…)
作用:查询部分列,并进行排序,默认为升序排序,如果想进行降序排序,需要在列的前面加上-号
只要返回值是QuerySet就可以进行order_by()排序

In [9]: b2 = Book.objects.order_by('-price')

In [10]: for i in b2:
    ...:      print("书名为",i.title,"价格为:",i.price)
    ...:

书名为 JQure 价格为: 90.00
书名为 HTML5 价格为: 90.00
书名为 Linux 价格为: 80.00
书名为 Django 价格为: 70.00
书名为 Java 价格为: 25.00
书名为 Python 价格为: 20.00
# 按照价格的降序排序

例题:
创建一个网站,可以显示我们当前数据库中book表中的所有数据

  1. 在bookstores中的views.py中实现函数
def get_book(requests):	
	from .models improt Book
    all_book = Book.objects.all()
    return render(requests, 'all_book.html', locals())
  1. 在bookstore目录下创建一个templates模板目录,再创建一个all_book.html文件
  2. 在html文件中进行for标签的使用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>获取数据库中的所有书名数据</title>
</head>
<body>
<table border="4">
    <tr>
        <th>id</th>
        <th>title</th>
        <th>pub</th>
        <th>price</th>
        <th>market_price</th>
        <th>option</th>
    </tr>
    {% for book in all_book %}
    <tr>
        <th>{{ book.id }}</th>
        <th>{{ book.title }}</th>
        <th>{{ book.pub }}</th>
        <th>{{ book.price }}</th>
        <th>{{ book.mark_price }}</th>
        <th>
            <a href="">删除</a>
            <a href="">更新</a>
        </th>
    </tr>
    {% endfor %}

</table>


</body>
</html>
  1. 在主路由中创建一个新的path包含应用bookstore
    path('bookstore/',include('bookstore.urls'))
  1. 在bookstore中创建一个urls,并向其中添加urlpatterns参数,并加入新的path
from . import views
from django.urls import path


urlpatterns = [
    path('all_book/',views.get_book),
]

这样就可以凭借127.0.0.1:8000/bookstore/all_book/来访问页面了
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值