django单表查询,测试脚本,查看内部SQL语句的方式,下划线查询,多表增删改查,正反向的概念,多表查询-子查询(基于对象的跨表查询),下划线联表查询

单表查询


#增(方式1)
# models.User.objects.create(name='lz',age=16,register_time='2022-11-1')
# #(方式2)
# import datetime
# ctime = datetime.datetime.now()
# user_obj = models.User(name='kk',age=19,register_time=ctime)
# user_obj.save()

#删(方式1)
# res = models.User.objects.filter(pk=2).delete()
# print(res)
'''
pk会自动查找到当前表的主键字段,指代的就是当前表的主键字段
用pk后,就不需要知道当前主键字段到底叫什么了
'''
#(方式2)
# user_obj = models.User.objects.filter(pk=1).first()
# user_obj.delete()

#修改(方式1)
# models.User.objects.filter(pk=4).update(name='lzDSB')
#(方式2)
# user_obj = models.User.objects.get(pk=4)
# user_obj.name = 'lzDS'
# user_obj.save()
'''
get 方法返回的直接就是当前对象,但是该方法不推荐使用
因为一旦数据不存在直接报错,而filter不会
'''

测试脚本

'''
当你只是想测试django中某一个晚间内容,那不用书写前后端交互的形式,
而是直接写一个测试脚本即可
'''
#测试环境的准备,去manage.py中拷贝几行代码,在写两行代码
import os
if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day64_django.settings')
    
    import django
    django.setup()
    
    from app01 import models
    models.User.objects.all()

查看内部SQL语句的方式

#方式1
res = models.User.objects.values_list('name','age')
print(res.query)  #<QuerySet [('kk', 19), ('lzDS', 16)]>

queryset对象才能点击query查看内部的SQL语句

#方式2:所有的SQL语句都能查看
#去配置文件配置以下代码
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '[%(asctime)s] %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    },
}

from django.db import models

# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    register_time = models.DateField()   #年月日
    '''
    DateField
    DateTimeField
        两个重要参数
        auto_now:每次操作数据的时候,该字段会自动将当前时间更新
        auto_now_add:在创建数据的时候会自动将当前时间记录下来,
        之后只要不人为修改,数据不会变(注册)
    '''
    #
    # def __str__(self):
    #     return '对象:%s'%self.name

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    publish_date = models.DateField(auto_now_add=True)

    #一对多
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
    #多对多
    author = models.ManyToManyField(to='Author')


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)
    email = models.EmailField()

    def __str__(self):
        return '对象:%s'%self.name

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()

    #一对一
    author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)

class AuthorDetail(models.Model):
    phone = models.BigIntegerField()  #号码用BigIntegerFiled或者用CharFiled
    addr = models.CharField(max_length=64)
    #必知必会13条(表名为User)

    #1、all() 查询所有数据

    #2、filter()带有过滤条件
    #3、get() 直接那数据对象,数据不存在报错
    #4、first()  那queryset里面第一个元素

    # res = models.User.objects.all().first()
    # print(res)

    #5、last()
    # res = models.User.objects.all().last()
    # print(res)

    #6、values()  可以指定获取的数据字段,select name,age from ...   列表套字典
    # res = models.User.objects.values('name','age')
    # print(res) #<QuerySet [{'name': 'kk', 'age': 19}, {'name': 'lzDS', 'age': 16}]>

    #7、values_list()  列表套元组
    # res = models.User.objects.values_list('name','age')
    # print(res)  #<QuerySet [('kk', 19), ('lzDS', 16)]>

    #8、distinct()  去重
    # res = models.User.objects.values('name','age').distinct()
    # print(res)
    '''
    去重一定是一模一样的数据,如果带有主键数据肯定不一样(不能忽略主键)
    '''
    #9、order_by() 排序
    # res = models.User.objects.order_by('age')  #默认升序
    # res = models.User.objects.order_by('-age')  #降序(加负号)
    # print(res)

    #10、reverse() 反转 前提是已经排序过,可以跟在order_by后面

    #11、count()   统计当前User表的数据个数
    # res = models.User.objects.count()
    # print(res)

    #12、exclude()  除了
    # res = models.User.objects.exclude(name='lz')
    # print(res)

    #13、exists()  返回布尔值
    # res = models.User.objects.filter(pk=4).exists()
    # print(res)

下划线查询

 #双下划线查询
    #大于19岁
    # res = models.User.objects.filter(age__gt=19)
    # print(res)
    #小于(lt)
    #大于等于(gte)小于等于(lte)
    # res = models.User.objects.filter(age__gte=19)
    # print(res)

    #年龄是16或者23或者37
    # res = models.User.objects.filter(age__in=[16,23,37])
    # print(res)

    #年龄在19-37(首尾都要)
    # res = models.User.objects.filter(age__range=[19,37])
    # print(res)

    #查询名字有z的数据(区分大小写)
    # res = models.User.objects.filter(name__contains='z')
    # print(res)
    #忽略大小写(在contains前面加i)
    # res = models.User.objects.filter(name__icontains='d')
    # print(res)

    #查询l开头(startswith)结尾(endswith)
    # res = models.User.objects.filter(name__startswith='l')
    # print(res)

    #查询出注册时间为2022年  5月
    # res = models.User.objects.filter(register_time__year='2022')
    # print(res)

    # res = models.User.objects.filter(register_time__month='5')
    # print(res)

    #两个一起查
    # res = models.User.objects.filter(register_time__year='2022')\
    #       and models.User.objects.filter(register_time__month='5')
    # print(res)

多表增删改查

  #一对多外键增删改查
    #增
    #方式1
    # models.Book.objects.create(title='论语',price=899.45,publish_id=1)
    # models.Book.objects.create(title='计算机网络',price=89.89,publish_id=1)
    # models.Book.objects.create(title='大数据',price=19.40,publish_id=2)
    # models.Book.objects.create(title='linux',price=189.23,publish_id=1)
    # models.Book.objects.create(title='python',price=99.45,publish_id=2)
    #方式2
    # publish_obj = models.Publish.objects.filter(pk=2).first()
    # models.Book.objects.create(title='红楼梦',price=234.56,publish=publish_obj)

    #删
    # models.Publish.objects.filter(pk=1).delete()   #联级删除

    #修改
    # models.Book.objects.filter(pk=1).update(publish_id=2)

    # publish_obj = models.Publish.objects.filter(pk=1).first()
    # models.Book.objects.filter(pk=1).update(publish=publish_obj)


    #多对多增删改查  就是在操作第三张表
    #增
    book_obj = models.Book.objects.filter(pk=2).first()
    # # book_obj.author.add(1)
    # book_obj.author.add(2,3)
    # book_obj = models.Book.objects.filter(pk=2).first()
    # book_obj.author.add(1)
    # book_obj.author.add(2,3)

    # author_obj = models.Author.objects.filter(pk=2).first()
    # author_obj1 = models.Author.objects.filter(pk=3).first()
    # book_obj.author.add(author_obj,author_obj1)
    '''
    add给第三张表添加数据
    括号内既可以传数字也可以传参数,并且支持多个
    '''

    #删
    # book_obj.author.remove(2)
    # book_obj.author.remove(1,3)

    # author_obj = models.Author.objects.filter(pk=2).first()
    # author_obj1 = models.Author.objects.filter(pk=3).first()
    # book_obj.author.remove(author_obj,author_obj1)

    '''
    remove
    括号内既可以传数字也可以传参数,并且支持多个
    '''

    #修改set
    # book_oj.author.set([2,2])
    # book_obj.author.set([3])
    # author_obj = models.Author.objects.filter(pk=2).first()
    # author_obj1 = models.Author.objects.filter(pk=3).first()
    # book_obj.author.set([author_obj,author_obj1])

    '''
    set 
        括号内必须传一个可迭代对象,该对象内既可以数字也可以是对象,并且支持多个
    '''

    #清空
    #在第三张表中清空某一个书籍与作者的绑定关系
    # book_obj.author.clear()
    '''
    括号内不要加如何参数
    '''

正反向的概念

book(外键在书这边)>>>publish      正向
publish(外键在数这边)>>>book    反向
'''
正向查询按字段,反向查询按表名小写
'''

多表查询

子查询(基于对象的跨表查询)


    #基于对象的跨表查询

    #1、查询书籍主键为1的出版社
    # book_obj = models.Book.objects.filter(pk=1).first()
    # #书查出版社   正向
    # res = book_obj.publish
    # print(res)
    # print(res.name)
    # print(res.addr)


    #2、查询书籍为1的作者(正向)
    # book_obj = models.Book.objects.filter(pk=1).first()
    # res = book_obj.author.all()
    # print(res)

    #3、查询作者lz的电话号码(正向)
    # author_obj = models.Author.objects.filter(name='lz').first()
    # res = author_obj.author_detail
    # print(res)
    # print(res.phone)
    # print(res.addr)

    '''
    正向查询
        当你查询结果可能有多条的时候要加.all()
        book_obj.publish
        book_obj.author.all()
        author_obj.author_detail
    '''

    #4、查询出版社是东方出版社出版的书
    # publish_obj = models.Publish.objects.filter(name='东方出版社').first()
    #出版社查书   反向
    # res = publish_obj.book_set   #app01.Book.None(看到这个在后面加all())
    # res = publish_obj.book_set.all()
    # print(res)


    #5、查询作者是lz的书
    # author_obj = models.Author.objects.filter(name='lz').first()
    #作者查书  反向
    # res = author_obj.book_set  #app01.Book.None
    # res = author_obj.book_set.all()
    # print(res)


    # #6、查询手机号为110的作者姓名
    # author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
    # res = author_detail_obj.author
    # print(res.name)
    '''
    当你查询结果有多个数据时候要加_set.all()
    publish_obj.book_set.all()
    author_obj.book_set.all()
    author_detail_obj.author
    '''

下划线联表查询


    #1、查询lz的手机号和作者名字(正向)
    # res = models.Author.objects.filter(name='lz').values('author_detail__phone','name')
    # print(res)
    #反向
    # res = models.AuthorDetail.objects.filter(author__name='lz')  #作者名字是lz的作者详情
    # res = models.AuthorDetail.objects.filter(author__name='lz').values('phone','author__name')
    # print(res)


    #2、查询书籍主键为1的出版社名称和书的名字(正向)
    # res = models.Book.objects.filter(pk=1).values('title','publish__name')
    # print(res)
    #反向
    # res = models.Publish.objects.filter(book__pk=1).values('name','book__title')
    # print(res)



    #3、查询书籍主键为1 的作者姓名  正向
    # res = models.Book.objects.filter(pk=1).values('author__name')
    # print(res)
    #反向
    # res = models.Author.objects.filter(book__pk=1).values('name')
    # print(res)


    #查询书籍主键是1的作者的手机号
    #book author author_detail

    res = models.Book.objects.filter(pk=1).values('author__author_detail__phone')
    print(res)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值