Django框架详细介绍---ORM相关操作

Django ORM相关操作

官方文档:

https://docs.djangoproject.com/en/2.0/ref/models/querysets/

1.必须掌握的十三个方法

<1> all()                 查询所有结果
 
<2> filter(**kwargs)      它包含了与所给筛选条件相匹配的对象
 
<3> get(**kwargs)         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一
                个或者没有都会抛出错误
<4> exclude(**kwargs) 它包含了与所给筛选条件不匹配的对象 <5> values(*field) 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实
               例化对象,而是一个可迭代的字典序列
<6> values_list(*field) 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <7> order_by(*field) 对查询结果排序 <8> reverse() 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用
                (在model类的Meta中指定ordering或调用order_by()方法)
<9> distinct() 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果
                此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重)
<10> count() 返回数据库中匹配查询(QuerySet)的对象数量 <11> first() 返回第一条记录 <12> last() 返回最后一条记录 <13> exists() 如果QuerySet包含数据,就返回True,否则返回False

  分类:

    1)返回QuerySet对象的方法

all()
filter()
exclude()
order_by()
reverse()
distinct()
values()
values_list()

    2)返回具体对象

get()
first()
last()

    3)返回布尔值

exists()

    4)返回数字的方法

count()

2.ForeignKey,外键

示例:

from django.db import models


# Create your models here.
#
class Book(models.Model):
    title = models.CharField(max_length=32)
    publish_date = models.DateField(auto_now_add=True)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    memo = models.TextField(null=True)
    # 创建外键,关联publish
    publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE, related_name='books')
    # 创建多对多关联author
    author = models.ManyToManyField(to="Author")

    def __str__(self):
        return self.title


# 出版社
class Publisher(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)

    def __str__(self):
        return self.name


# 作者
class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    phone = models.CharField(max_length=11)
    detail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)

    def __str__(self):
        return self.name


# 作者详情
class AuthorDetail(models.Model):
    addr = models.CharField(max_length=64)
    email = models.EmailField()
模型

说明:

  因为建立每个模型也就是新建类的时候调用了__str__方法,所以通过类实例出对象时,默认返回该对象中指定的属性值  

扫描二维码关注公众号,回复: 1693485 查看本文章

  1)正向查找

  对象查找---跨表查找

语法:  
  对象.关联字段.字段
# 获取书名为"七侠五义"的对象     
obj = models.Book.objects.get(title='七侠五义')
# 书籍和出版社间通关外键建立联表关系,可通过书籍对象跨表查询得到出版社的对象
print(obj.publisher)
# 得到出版社对象的名称
print(obj.publisher.name)

  字段查找---跨表查找

语法:
    关联字段__字段
# 通过书籍对象获取对应出版社的名称和地址
ret = models.Book.objects.filter(title='七侠五义').values('publisher__name','publisher__city')
print(ret)

  2)反向操作

  对象查找

语法:
  对象.表名_set
# 获取出版社的名称
obj = models.Publisher.objects.get(name='南方传媒出版社')
# 反向获取该出版社下的书籍
books = obj.book_set.all()
print(books)

  字段查找

语法:
    表名__字段
# 反向获出版社下的书籍
ret = models.Publisher.objects.filter(name='南方传媒出版社').values('books__title')
print(ret)

 3.ManyToManyField,多对多

  关联管理器是在一对多或者多对多的关联上下文中是使用的管理器

  存在两种情况:

    A.外键关系的反向查询

    B.多对多关联关系

  简单的说就是当点后面的对象---(针对对象操作)可能存在多个的时候就可以使用以下方法:

  create(),创建一个新对象,保存对象,并将它添加到关联对象集之中,返回新建的对象

import datetime
# 通过获取到的第一个作者新建一个书籍对象 models.Author.objects.first().book_set.create(title='黑鹰传奇',
                            publish_date=datetime.date.today(),
                            price=100, publisher_id=1)

 

   add(),把指定的model对象添加到关联的对象中

author_objs = models.Author.objects.filter(id__gt=2)
print(author_objs)
print(*author_objs)
# 获取书籍对象,通过*打散获取到的QuerySet添加到书籍对象中
models.Book.objects.get(title='七侠五义').author.add(*author_objs)

  添加ID

models.Book.objects.get(title='黑影传奇').author.add(*[3, 4, 7])

  set(),更新model对象的关联对象

models.Book.objects.get(title='黑影传奇').author.set([3, 4])

  remove(),从关联对象中移除

models.Book.objects.get(title='黑影传奇').author.remove(*[3, 4])

  clear(),将关联的对象清除

models.Book.objects.get(title='黑影传奇').author.clear()

强调:

  A.对于ForeignKey对象,clear()和remove()方法仅在null=True时才存在

示例:

  不存在null=True时,没有clear()和remove()方法:

models.Publisher.objects.first().book_set.clear()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'RelatedManager' object has no attribute 'clear'

  B.对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法

4.聚合查询和分组查询

  1)聚合

猜你喜欢

转载自www.cnblogs.com/mdzzbojo/p/9211153.html