• 17-2 orm单表操作和多表操作


    参考:https://www.cnblogs.com/liwenzhou/p/8660826.html

    一  ORM单表操作

    1 增删改查

     1 1. 查询
     2 1. 查所有
     3 models.Publisher.objects.all()
     4 2. 查某个具体的记录
     5 models.Publisher.objects.get(id=1) --> 注意查询条件不成立就报错
     6 2. 删除一条记录
     7 models.Publisher.objects.get(id=1).delete()
     8 3. 创建一条记录
     9 models.Publisher.objects.create(name="新出版社名字", addr="出版社地址") 
    10 4. 修改一条记录
    11 obj = models.Publisher.objects.get(id=1)
    12 obj.name = "新名字"
    13 obj.save()

    2 字段和参数:

    --1. 字段
      1. CharField 字符类型,必须提供max_length
      2. AutoField int自增
      3. DateField 日期字段

      4. DateTimeField() 日期时间字段
      5. IntergeField() 整数类型
    --2. 参数
      1. null=True 可以为空
      2. default=默认值
      3. unique=True 表示是唯一的
    --4. 时间字段
      1. auto_now_add=True 创建数据记录的时候会把当前时间添加到数据库
      2. auto_add=True 每次更新数据记录的时候会更新该字段。

    3 ORM必知必会单表查询13条:

    		          1. all()		            --> 查询所有结果
    				2. filter()                          --> 根据查询条件查询数据库的
    				3. get()                             --> 获取一个唯一的值
    				4. exclude()                         --> 将符合条件的都剔除掉,留下不符合条件的
    				5. values('字段名', ...)             --> 返回一个QuerySet,里面是字典
    				6. values_list(字段名', ...)         --> 返回一个QuerySet,里面是元祖
    				7. order_by()                        --> 对查询结果排序
    				8. reverse()                         --> 对一个有序的查询结果集做反转
    				9. distinct()                        --> 去重,跨表查询时去掉重复的记录,MySQL不支持按字段去重
    				10. count()                          --> 返回数据条数
    				11. first()                          --> 取第一个数据
    				12. last()                           --> 取最后一条数据
    				13. exists()                         --> 判断表里有没有数据

    分类:
    1. 返回QuerySet列表的有哪一些?
    1. all()
    2. filter()
    3. exclude()
    4. order_by()
    5. reverse()
    6. distinct()

    7. values('字段名', ...) --> 查询结果的列表里,都是字典
    8. values_list(字段名', ...) --> 查询结果的列表里,都是元祖

    2. 返回具体对象的
    1. first()
    2. last()
    3. get()

    3. 返回数字的
    1. count()
    4. 返回布尔值
    1. exists()

    4 单表查询双下划线操作

    例子:

     1 models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
     2  
     3 models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
     4 models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
     5  
     6 models.Tb1.objects.filter(name__contains="ven")  # 获取name字段包含"ven"的
     7 models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
     8  
     9 models.Tb1.objects.filter(id__range=[1, 3])      # id范围是1到3的,等价于SQL的bettwen and
    10  
    11 类似的还有:startswith,istartswith, endswith, iendswith 
    12 
    13 date字段还可以:
    14 models.Class.objects.filter(first_day__year=2017)

    5 如何在一个py文件中 使用Django项目的相关配置或内容,比如之间连接djanjo里面的数据库,在新建的py文件里面写上下面这个即可:

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

    二 ORM跨表操作

    1 外键 ForeignKey

    通过Foreignkey字段 ,能够得到和我关联的那个对象
    数据库中保存的字段名是 外键字段_id

    例子:书名关联出版社

    1 class Book(models.Model):
    2     title = models.CharField(max_length=32)
    3     publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE)

    on_delete=models.CASCADE的意思是当主表删除数据之后,从表也跟着删除

    2  外键增删改查操作

    详情见练习和作业

    3 跨表查询:

    正向查询:

    # 查询第一本书关联的出版社的名字
    # 1. 基于对象的查询
    # book_obj = models.Book.objects.first()
    # ret = book_obj.publisher.name
    # print(ret)
    # 2. 基于queryset的双下划线查询,双下划线表示跨表
    # ret = models.Book.objects.all().values_list("publisher__name").distinct()
    # print(ret)

    # 反向查询

    # 由出版社反向查找书籍
    publisher_obj=models.Publisher.objects.get(id=2)
    books=publisher_obj.book_set.all()
    title=books.values_list("title","id")
    print(title)
    
    # 2. 基于queryset的双下划线
    # 江出版社出版的所有书籍的书名
    ret = models.Publisher.objects.filter(id=2).values_list("book__title","book__id")
    print(ret)
  • 相关阅读:
    elasticsearch之建议器Suggester
    elasticsearch,kibana之相关配置
    elasticsearch之分析过程
    elasticsearch之mappings
    elasticsearch for Mac OS
    项目精讲
    博客园项目开发流程
    Django之auth模块
    DJango中间件
    DJango之模板层
  • 原文地址:https://www.cnblogs.com/huningfei/p/9466679.html
Copyright © 2020-2023  润新知