DJango-2、操作数据库

目录

前置条件

DJango对数据库增删改查

单表

新增

查询

修改

删除

多表

新增

查询(以下两种方法一样)


前置条件

在app下的model.py中建表

from django.db import models


# Create your models here.

class Nav(models.Model):
    name = models.CharField(max_length=10, unique=True, verbose_name='导航名称')
    is_delete = models.SmallIntegerField(default=1, verbose_name='是否被删除')  # 1代表未删除,0代表删除(物理删除)
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)  # auto_now_add插入数据的时候自动取当前时间
    update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)  # 修改数据的时候,时间会变

    def __str__(self): # 查询时指定返回name,否则返回的是看不懂的对象
        return self.name

    class Meta: # 必须叫这个名字
        verbose_name = '导航表'
        verbose_name_plural = verbose_name
        db_table = 'nav' # 默认会使用类名_类名,当做表名,若是不想使用默认的,可以自己指定表名
        # ordering = ['update_time'] # 查询数据库的时候,用来排序的

在model.py的同级目录创建model_test.py文件,用于测试操作数据库

操作数据库的测试文件

# models.py文件

import django,os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','dj_blog.settings') # 设置Django的配置文件,第二个参数为自己的项目名称.settings
django.setup()
# 必须先写上以上几行代码,以上代码可以实现右键操作model(操作数据库)

from blog import models # 导入要查询的app下方的models模块
from django.db.models import Q # 导入Q模块,用于或条件查询

DJango对数据库增删改查

单表

新增

# 新增数据的两种方式
models.Nav.objects.create(name='我的日记3')

nav_obj = models.Nav(name = '我的心情3') # 实例化
nav_obj.save()

查询

get()方法:只支持单条结果精确查询

# get方法查询,必须保证查询出来只有一条,否则报错
result = models.Nav.objects.get(id=1) # 查询出來是一个对象,可以.属性取值
print(result)
print(result.name)
print(result.create_time)

filter()方法:支持多条件查询,支持多结果接收

result2 = models.Nav.objects.filter(is_delete=1) # 查询所有is_delete=1的数据

# 与查询
result3 = models.Nav.objects.filter(is_delete=1,name='我的心情') # 查询所有is_delete=1且name='我的心情'的数据,多个and条件用逗号分隔即可
print(result2)
print(result3)

# 或查询
result11 = models.Nav.objects.filter(Q(id__contains='6')|Q(id__contains='3'))
print(result11)

filter()方法:模糊查询

# 模糊查询,__gt代表大于,__gte代表大于等于,__lt代表小于,__lte代表小于等于,__range查询指定范围的数据,id__in查询包含指定值的数据

result4 = models.Nav.objects.filter(name__contains='我的',id__gt=1)
result5 = models.Nav.objects.filter(name__contains='我的',id__gte=1)
result6 = models.Nav.objects.filter(name__contains='我的',id__lt=4)
result7 = models.Nav.objects.filter(name__contains='我的',id__lte=6)
result8 = models.Nav.objects.filter(id__range=[1,5])
result9 = models.Nav.objects.filter(id__in=[1,2,3,5])

print(result4)
print(result5)
print(result6)
print(result7)
print(result8)
print(result9)

# 可以无限.filter,.exclude。下边这个例子的意思是先排除name中包含博客的内容,然后剩下的数据在过滤name包含我的的内容,然后再排除name中包含1的内容
result12 = models.Nav.objects.exclude(name__contains='博客').filter(name__contains='我的').exclude(name__contains='1')
print(result12)

fitst()方法:返回一个字符串形式的对象,不加的话返回的是QuerySet,见下图

all()方法:查询全部数据

# 查询全部数据
all = models.Nav.objects.all()
print(all)

# all()方法也支持.filter
result13 = models.Nav.objects.all().filter(name='我的日记')
print(result13)

exclude()方法:排除查询,查询除了指定值以外的数据

# exclude()排除,查询除了指定值以外的数据

result10 = models.Nav.objects.exclude(id=1)
print(result10)

修改

# 方式1:单个修改
m = models.Nav.objects.get(id=1) # get(pk=1)同get(id=1),pk代表主键
m.name = '我的日记-修改'
m.is_delete = 0
m.save()

# 方式2:批量修改
models.Nav.objects.filter(name__contains='我的').update(is_delete=0) # 将名字包含我的的数据,的is_delete字段更改为0
models.Nav.objects.all().update(is_delete=1)

删除

# 单个删除
# d = models.Nav.objects.get(id=1) # 删除id为1的数据
# d.delete()

# 批量删除
models.Nav.objects.filter(name__contains='心情').delete()

# 全部删除
# models.Nav.objects.all().delete()

多表

新增

# 向表中插入数据,1对多
navs = models.Nav.objects.all() # 先将Nav表中的数据查出来
for i in navs:
    nav = models.Nav.objects.get(name=i)
    models.Article.objects.create(title='django教程1',content='django教程11111',nav_id=i.id) # nav_id=i.id等同于nav=i
    models.Article.objects.create(title='django教程2',content='django教程11111',nav_id=i.id)
    models.Article.objects.create(title='django教程3',content='django教程11111',nav_id=i.id)
    models.Article.objects.create(title='django教程4',content='django教程11111',nav_id=i.id)
    models.Article.objects.create(title='django教程5',content='django教程11111',nav_id=i.id)

查询(以下两种方法一样)

# 基础查询方法
nav = models.Nav.objects.get(name='我的日记1') # 查询 Nav表中,name='我的日记1'的对象
result = models.Article.objects.filter(nav_id = nav.id) # 查询Article表中,nav_id='我的日记1'对应的id
print(result)


# 查询数据--一对多:外键反向查询方法
nav = models.Nav.objects.get(name='我的日记1')# 查询 Nav表中,name='我的日记1'的对象
result2 = nav.article_set.all()# 查询有外键关联的字段,nav(代表被外键关联的表).article(代表有外键关联的表名)_set分别代表
print(result2)

多对多

前置条件-创建数据库表

from django.db import models
from utils import tools
from earth import settings


class BaseModel(models.Model):
    '''公共字段'''
    is_delete_choice = (
        (0, '删除'),
        (1, '正常')
    )
    is_delete = models.SmallIntegerField(choices=is_delete_choice, default=1, verbose_name='是否被删除')
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)  # auto_now_add的意思,插入数据的时候,自动取当前时间
    update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)  # 修改数据的时候,时间会自动变

    class Meta:
        abstract = True  # 只是用来继承的,不会创建这个表


class Author(BaseModel):
    name = models.CharField(verbose_name='名称', max_length=20)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '作家'
        verbose_name_plural = verbose_name
        ordering = ['id']
        db_table = 'eg_author'


class Book(BaseModel):
    name = models.CharField(verbose_name='书名', max_length=20)
    price = models.FloatField(verbose_name='价格')
    count = models.IntegerField(verbose_name='数量')
    # author = models.ForeignKey(Author, on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='作者')
    author = models.ManyToManyField(Author,  verbose_name='作者')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '书籍'
        verbose_name_plural = verbose_name
        ordering = ['id']
        db_table = 'eg_book'

前置条件-创建测试文件

import django,os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','earth.settings')
django.setup()

from example import models

新增数据

# 作者表的数据
models.Author.objects.create(name='wxy')
models.Author.objects.create(name='xiyang')

# 书表的数据
models.Book.objects.create(name='自动化1',price=20,count=3)
models.Book.objects.create(name='自动化1',price=20,count=3)
models.Book.objects.create(name='自动化1',price=20,count=3)

查询数据

# 查询作者和书
author1 = models.Author.objects.filter(id=1).first()
author2 = models.Author.objects.filter(id=2).first()
book1 = models.Book.objects.filter(id=1).first()
book2 = models.Book.objects.filter(id=2).first()
book3 = models.Book.objects.filter(id=3).first()
print(author1) # wxy
print(book1) # <QuerySet [<Book: 自动化1>]>

创建多对多关系

# 创建作者和书的多对多关系,一本书有两个作者,一个作者有多本书
book1.author.add(author1)
book1.author.add(author2)
book2.author.add(author1)
book2.author.add(author2)

多对多查询

# 多对多查询--正向查询,根据书去查作者
z = book1.author.all()
print(z)
# 多对多查询--反向查询,根据作者去查书
f = author1.book_set.all()
print(f)

解除多对多关系

# 解除多对多的关系(解除谁就传入谁)
book1.author.remove(author1)

# 清除关系 将作者2的书全部删掉
book2.author.clear()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值