django5数据库查询操作 及字段说明

1.1命令框内创建新项目

打开指定文件夹,在路径位置输入cmd打开命令行
django-admin startproject 项目名 创建项目

1.2在新项目内创建子应用

python manage.py startapp 子应用名

1.3注册子应用

在settings.py文件内注册子应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    '创建的子应用名'
]

1.4配置模板

在settings.py文件内配置模板

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

1.5配置数据库

在settings.py文件内


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'localhost',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '密码',
        'NAME': '创建的数据库名',
    }
}

1.6修改语言和时区

在settings.py文件内

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

1.7配置静态文件

在settings.py文件内

1.8常用的mysql代码语句

查看所有数据库: show databases;
创建数据库: create database 数据名 charset=utf8;
删除数据库: drop database 数据库名;
调用数据库: use 数据库名;
查看数据库下的所有表: show tables;
查看表结构: desc 表名;
查看表中的所有数据: select * from 表名;

1.9安装数据库

在跟项目名同名的文件夹内init.py文件里安装

import pymysql
pymysql.install_as_MySQLdb()

1.9.1创建模型类

在子应用文件夹里的models.py创建


from django.db import models

class BookInfo(models.Model):

    name = models.CharField(max_length=20, verbose_name='书名')

    pub_date = models.DateField(null=True, verbose_name='发布日期')

    read_count = models.IntegerField(default=0, verbose_name='阅读量')

    comment_count = models.IntegerField(default=0, verbose_name='评论量')

    sale_out = models.BooleanField(default=False, verbose_name='售空')

    class Meta:
        db_table = 'bookinfo'
        verbose_name = '书籍信息表'
        verbose_name_plural = verbose_name

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.name

class PeopleInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    book = models.ForeignKey(bookinfo, on_delete=models.CASCADE, verbose_name='图书')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'peopleinfo'
        verbose_name = '人物信息'
        verbose_name_plural=verbose_name

    def __str__(self):
        return self.name

类型说明BooleanField布尔字段,值为True或FalseCharField字符串,参数max_length表示最大字符个数TextField大文本字段,一般超过4000个字符时使用IntegerField整数DecimalField十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数FloatField浮点数DateField日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于”最后一次修改”的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误TimeField时间,参数同DateFieldDateTimeField日期时间,参数同DateFieldFileField上传文件字段ImageField继承于FileField,对上传的内容进行校验,确保是有效的图片

选项说明null如果为True,表示允许为空,默认值是Falseblank如果为True,则该字段允许为空白,默认值是Falsedb_column字段的名称,如果未指定,则使用属性的名称db_index若值为True, 则在表中会为此字段创建索引,默认值是Falsedefault默认primary_key若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用unique如果为True, 这个字段在表中必须有唯一值,默认值是Falseverbose_name对于字段的一个可读性更高的名称

6 外键
在设置外键时,需要通过 on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

  • CASCADE级联,删除主表数据时连通一起删除外键表中数据
  • PROTECT保护,通过抛出 ProtectedError异常,来阻止删除主表中被外键应用的数据
  • SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
  • SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用

1.9.2创建好模型类后进行迁移

在项目内终端执行
生成迁移文件:python manage.py makemigrations
执行迁移:python manage.py migrate
如果迁移出错,把数据库删了创建新的数据库,生成的迁移文件也删了,重新执行上面2个步骤

1.9.3创建超级用户

创建超级用户 (python终端内运行)
python manage.py createsuperuser
电子邮件地址直接回车跳过
(前后密码要一致)
如果出现cryptography报错就python终端内安装
pip install cryptography

2.在子应用的admin.py文件中添加代码,注册表,不然admin控制台没办法管理这个表

from django.contrib import admin

from myapp.models import BookInfo

admin.site.register(BookInfo)

3.运行项目,在admin页面添加数据

2 添加测试数据

在mysql里添加测试数据
也可以在admin管理员页面进行添加

insert into bookinfo(name, pub_date, read_count,comment_count, sale_out) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);

insert into peopleinfo(name, gender, book_id, description, is_delete)  values
    ('郭靖', 1, 1, '降龙十八掌', 0),
    ('黄蓉', 0, 1, '打狗棍法', 0),
    ('黄药师', 1, 1, '弹指神通', 0),
    ('欧阳锋', 1, 1, '蛤蟆功', 0),
    ('梅超风', 0, 1, '九阴白骨爪', 0),
    ('乔峰', 1, 2, '降龙十八掌', 0),
    ('段誉', 1, 2, '六脉神剑', 0),
    ('虚竹', 1, 2, '天山六阳掌', 0),
    ('王语嫣', 0, 2, '神仙姐姐', 0),
    ('令狐冲', 1, 3, '独孤九剑', 0),
    ('任盈盈', 0, 3, '弹琴', 0),
    ('岳不群', 1, 3, '华山剑法', 0),
    ('东方不败', 0, 3, '葵花宝典', 0),
    ('胡斐', 1, 4, '胡家刀法', 0),
    ('苗若兰', 0, 4, '黄衣', 0),
    ('程灵素', 0, 4, '医术', 0),
    ('袁紫衣', 0, 4, '六合拳', 0);

2.1shell工具

Django的manage工具提供了 shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。
通过如下命令进入shell
python manage.py shell

2.2数据库操作-增、删、改

在shell里一定要导包,只在python里边导包是没用的


bookinfo.objects.create(
    name='python',
    pub_date='2022-02-22',
    read_count=500,
    comment_count=200,
)

book=bookinfo(
    name='python高级',
    pub_date='2022-04-22',
    read_count=200,
    comment_count=100,
)
book.save()

bookinfo.objects.filter(name='python').update(sale_out=True)

book=bookinfo.objects.get(name='python高级')
book.read_count=222
book.save()

bookinfo.objects.filter(name='python').delete()

book=bookinfo.objects.get(name='python高级')
book.delete()

2.3查询

get查询单一结果,如果不存在会抛出 模型类.DoesNotExist异常。
all查询多个结果。
count查询结果数量。

实现SQL中的where功能,包括

  • filter过滤出多个结果
  • exclude排除掉符合条件剩下的结果
  • get过滤单一结果

使用aggregate()过滤器调用聚合函数。聚合函数包括: Avg平均, Count数量, Max最大, Min最小, Sum求和,被定义在django.db.models中。

使用 order_by对结果(QuerySet)进行排序


bookinfo.objects.all()

bookinfo.objects.count()

book=bookinfo.objects.get(name='射雕英雄传')

book=bookinfo.objects.filter(name='射雕英雄传')

book=bookinfo.objects.get(id=1)
book=bookinfo.objects.get(id__exact=1)

book=bookinfo.objects.filter(name__contains='湖')

book=bookinfo.objects.filter(name__endswith='部')

book=bookinfo.objects.filter(name__isnull=True)

bookinfo.objects.filter(id__in=[1,3,5])

bookinfo.objects.filter(id__gt=3)

bookinfo.objects.filter(pub_date__year=1980)

bookinfo.objects.filter(pub_date__gt='1990-01-01')

from django.db.models import F
bookinfo.objects.filter(read_count__gte=F('comment_count'))

bookinfo.objects.filter(read_count__gte=F('comment_count')*2)

from django.db.models import Q
bookinfo.objects.filter(read_count__gt=20,id__lt=3)
bookinfo.objects.filter(read_count__gt=20).filter(id__lt=3)
bookinfo.objects.filter(Q(read_count__gt=20) & Q(id__lt=3))

bookinfo.objects.filter(Q(read_count__gt=20) | Q(id__lt=3))

bookinfo.objects.exclude(id=3)
bookinfo.objects.filter(~Q(id=3))

from django.db.models import Sum,Max,Min,Avg,Count

bookinfo.objects.aggregate(Sum('read_count'))

bookinfo.objects.count()
bookinfo.objects.aggregate(Count('id'))

bookinfo.objects.all().order_by('read_count')
bookinfo.objects.all().order_by('-read_count')

books = bookinfo.objects.filter(id__lte=3).order_by('comment_count')

from books.models import bookinfo,PeopleInfo
book=bookinfo.objects.get(id=1)
book.peopleinfo_set.all()

PeopleInfo.objects.filter(book_id=1)

people=PeopleInfo.objects.get(id=1)
people.book

book=bookinfo.objects.filter(peopleinfo__id=1)

bookinfo.objects.filter(peopleinfo__name='郭靖')

bookinfo.objects.filter(peopleinfo__description__contains='八')

PeopleInfo.objects.filter(book__name='天龙八部')

PeopleInfo.objects.filter(book__comment_count__gt=30)

Django的ORM中存在查询集的概念。

查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。

当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):

  • all():返回所有数据。
  • filter():返回满足条件的数据。
  • exclude():返回满足条件之外的数据。
  • order_by():对结果进行排序。 对查询集可以再次调用过滤器进行过滤 *从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。

3.一对一关系

模型类使用 OneToOneField用来定义一对一关系;

比如当你拥有一个老师表时,紧接着你还需要一个教授表,那么教授表可能拥有老师表的一系列属性,那么你还不想把老师表中的字段直接复制到教授表那么可以通过 OnToOneField来实现教授表继承老师表

多对多关系在模型中使用 ManyToManyField字段定义

多对多关系可以是具有关联,也可以是没有关联,所以不需要明确指定 on_delete属性

生活中,多对多关系:一个乐队可以有很多音乐家,一个音乐家也可以隶属好多个乐队一个文章中可以有很多标签,一个标签也可出现在很多文章中在多对多关系中专门有第三张表来存储对应关系,表本身之间没有任何关联,此时删除和修改数据不影响另外一张表from

Original: https://blog.csdn.net/qishaoawei/article/details/124461222
Author: qishaoawei
Title: django5数据库查询操作 及字段说明

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/732734/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球