Django 全链路详解3

单表操作---16太保(之前已经略写增删查改)

1. 创建表 :  1.setting 配置   2.__init__.py 文件导入   3. models创建表   4.makemigrations  migrate  创建表到数据库

class Movie(models.Model):
    title = models.CharField(max_length=64)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    publish_time = models.DateField()   #年月日
    # publish_time = models.DateTimeField()   #年月日 时分秒  

2.  创建测试文件test.py

3.  单表查询- -16太保

QuerySet:  查询集合   列表套对象

<QuerySet [<Movie: Movie object>, <Movie: Movie object>]>

import os


if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
import django
django.setup()
    from app01 import models


""" 必知必会16条 1.create() 2.all() 3.filter() 4.update() 5.delete() 6.first() 7.last() 8.get() 9.values() 10.values_list() 11.order_by() 12.count() 13.exclude() 14.exists() 15.reverse() 16.distinct() """ # 1.create() 返回值就是当前被创建数据的对象本身 # 日期可以手动给 # models.Movie.objects.create(title='3D肉蒲团s',price=999.23,publish_time='2016-1-1') # 还可以直接传日期对象 # from datetime import date # ctime = date.today() # models.Movie.objects.create(title='西游记', price=666.23, publish_time=ctime) # 2.all() queryset对象 # res = models.Movie.objects.all() # print(res) # 3.filter() queryset对象 # res = models.Movie.objects.filter(id=1) # res = models.Movie.objects.filter(pk=1) # pk指代的就是当前表的主键字段名 自动查找非常方便 # res = models.Movie.objects.filter(pk=1,title='python入门') # 括号内可以放多个条件默认是AND关系 **************新知识点***************** # # 只要是queryset对象 就可以通过 点query 的方式查看到获取到当前对象内部sql语句 # print(res.query) # 4.get() 直接获取对象本身 不推荐使用 当查询条件不存在的时候直接报错 # res = models.Movie.objects.get(pk=1) # print(res) # print(res.title) # print(res.price) # res = models.Movie.objects.get(pk=1000) # res = models.Movie.objects.filter(pk=1000) # print(res) # 5.values() QuerySet对象 [{},{},{}] 获取指定字段对的数据 列表套字典 # res = models.Movie.objects.values('title','publish_time') # print(res) # print(res.query)
    # 6.values_list()  QuerySet对象  [(),(),()]  获取指定字段对的数据
    # res = models.Movie.objects.values_list('title','price')
    # print(res)
    # 7.first()    数据对象        取第一个元素对象
    # res = models.Movie.objects.filter().first()
    # print(res)

    # 8.last()    数据对象          取最后一个元素对象
    # res = models.Movie.objects.last()
    # print(res)

    
    # 9.update()  更新数据      返回值是受影响的行数
    # res = models.Movie.objects.filter(pk=1).update(title='金瓶2')
    # res = models.Movie.objects.filter(pk=1).update(title='金瓶2',price=666)
    # print(res)

    # 10.delete()  删除数据    返回值(1, {'app01.Movie': 1})  受影响的表及行数
    # res = models.Movie.objects.filter(pk=3).delete()
    # print(res)


    # 11.count()  统计数据条数
    # res = models.Movie.objects.count()
    # print(res)

    # 12.order_by  按照指定字段排序
    # res = models.Movie.objects.order_by('price')  # 默认是升序
    # res = models.Movie.objects.order_by('-price')  # 减号就是降序
    # print(res)


    # 13.exclude()  排除什么什么之外  少选条件
    # res = models.Movie.objects.exclude(pk=1)
    # print(res)

    # 14.exists()   返回的是布尔值  判断前面的对象是否有数据  了解即可
    # res = models.Movie.objects.filter(pk=1000).exists()
    # print(res)

    # 15.reverse()  反转
    # res = models.Movie.objects.order_by('price').reverse()
    # print(res)

    # 16.distinct()  去重:去重的前提 必须是由完全一样的数据的才可以
    # res = models.Movie.objects.values('title','price').distinct()
    # print(res)

双下划线查询数据:  filter(字段__条件)

# 神奇的双下划线查询
    # 1.查询价格大于200的电影
    # res = models.Movie.objects.filter(price__gt=200)
    # print(res)
    # 2.查询价格小于500的电影
    # res = models.Movie.objects.filter(price__lt=500)
    # print(res)
    # 3.查询价格大于等于876.23的电影
    # res = models.Movie.objects.filter(price__gte=876.23)
    # print(res.query)
    # 4.查询价格小于等于876.23的电影
    # res = models.Movie.objects.filter(price__lte=500)
    # print(res)
    # 5.查询价格是123 或666 或876
    # res = models.Movie.objects.filter(price__in=[123,666,876])
    # print(res)
    # 6.查询价格在200到900之间的电影  顾头也顾尾
    # res = models.Movie.objects.filter(price__range=(200,900))
    # print(res)
    # 7.查询电影名中包含字母p的电影
    """
    模糊查询:
        关键字 like
        关键符号
            %
            _
    """
    # res = models.Movie.objects.filter(title__contains='p')  # 默认是区分大小写
    # res = models.Movie.objects.filter(title__icontains='p')  # i忽略大小写
    # print(res)

    # 8.查询2014年出版的电影
    # res = models.Movie.objects.filter(publish_time__year=2014)
    # print(res)
    # 9.查询是1月份出版的电影
    # res = models.Movie.objects.filter(publish_time__month=1)
    # print(res)

多表查询 —创建表的关系数据  

数据库表创建

  # 一对多  publish
    # 1.增  直接写实际的表字段 publish_id
    # models.Book.objects.create(title='三国演义',price=123.23,publish_id=2)
    # 2.增
    # publish_obj = models.Publish.objects.get(pk=1)
    # models.Book.objects.create(title='金瓶',price=66.66,publish=publish_obj)

    # 查

    # 改
    # models.Book.objects.filter(pk=1).update(publish_id=3)
    # publish_obj = models.Publish.objects.get(pk=4)
    # models.Book.objects.filter(pk=1).update(publish=publish_obj)

    # 删
    """
    外键字段在1.X版本中默认就是级联更新级联删除的
    2.X版本中 则需要你自己手动指定
        百度一大堆
    """


    # 多对多
    # 1 给书籍绑定作者关系   add
    # book_obj = models.Book.objects.filter(pk=1).first()
    # 书籍和作者的关系是由第三张表绝对 也就意味着你需要操作第三张表
    # print(book_obj.authors)  # 书籍对象点虚拟字段authors就类似于已经跨到书籍和作者的第三张关系表中
    # book_obj.authors.add(1)  # 给书籍绑定一个主键为1的作者
    # book_obj.authors.add(2,3)

    # author_obj = models.Author.objects.get(pk=1)
    # author_obj1 = models.Author.objects.get(pk=3)
    # book_obj.authors.add(author_obj)
    # book_obj.authors.add(author_obj,author_obj1)

    """
    add专门给第三张关系表添加数据
        括号内即可以传数字也可以传对象  并且都支持传多个
    """
    # 2 移除书籍与作者的绑定关系  remove
    # book_obj = models.Book.objects.filter(pk=1).first()
    # book_obj.authors.remove(2)
    # book_obj.authors.remove(1,3)
    # author_obj = models.Author.objects.get(pk=2)
    # author_obj1 = models.Author.objects.get(pk=3)
    # book_obj.authors.remove(author_obj)
    # book_obj.authors.remove(author_obj,author_obj1)
    """
    remove专门给第三张关系表移除数据
        括号内即可以传数字也可以传对象  并且都支持传多个
    """
    # 3 修改书籍与作者的关系   set
    # book_obj = models.Book.objects.filter(pk=1).first()
    # # book_obj.authors.set((3,))
    # # book_obj.authors.set((2,3))
    # author_obj = models.Author.objects.get(pk=2)
    # author_obj1 = models.Author.objects.get(pk=3)
    # # book_obj.authors.set((author_obj,))
    # book_obj.authors.set([author_obj,author_obj1])

    """
    set 修改书籍与作者的关系    set 有则修改,无则新增
        括号内支持传数字和对象 但是需要是可迭代对象
    """
    # 4 清空书籍与作者关系
    # book_obj = models.Book.objects.filter(pk=1).first()
    # book_obj.authors.clear()  # 去第三张表中清空书籍为1的所有数据
    """
    clear()  清空关系
    不需要任何的参数
    """

  

猜你喜欢

转载自www.cnblogs.com/bigbox/p/12168635.html
今日推荐