S20_DAY17--课堂笔记

查询表记录

基于对象查询(子查询)

      一对多 
      
                正向查询,按字段
          Book-------------------->Publish
              <---------------------
                反向查询,按表名小写_set:book_set
      
      
          obj=Book.objects.fliter(title="python").first()
          obj.publish
            
        
      多对多
      
                正向查询,按字段
          Book-------------------->Author
              <---------------------
              查询,按表名小写_set:book_set
      
      
     
          obj=Book.objects.fliter(title="python").first()
          obj.author.all()  #  [obj,....]

      
     一对一:
     
                正向查询,按字段
          Book-------------------->Author
              <---------------------
                查询,按表名小写
基于对象查询(子查询)
基于queryset查询

        
              正向查询,按字段
          A-------------------->B
          <---------------------
        查询,按表名小写
基于queryset查询
聚合和分组

        
  book   
    
    
    id   title    publish                       
     
    1     php       苹果        
        
    2     python    苹果      
    3     go        橘子

sql:  select publish,Count(*) from Book group by publish   
       
    #查询每一个出版社出版的书籍个数

    # ret=Publish.objects.all().annotate(c=Count("book")).values("name","c")
    # print(ret)


    # 查询每一个作者出版的书籍的平均价格
    ret=Author.objects.all().annotate(price_avg=Avg("book__price")).values("name","price_avg")
    print(ret)

    #查询每一本书籍名称以及作者的个数

    ret=Book.objects.all().annotate(c=Count("author")).values("title","c")
    print(ret)

    # 查询价格大于200的每一本书籍名称以及作者的个数
    ret = Book.objects.filter(price__gt=200).annotate(c=Count("author")).values("title", "c")
    print(ret)
聚合和分组
F查询与Q查询


    # F
    from django.db.models import F,Q
    ret=Book.objects.filter(comment_num__gt=F("poll_num"))
    print(ret)
    ret=Book.objects.filter(comment_num__gt=F("read_num")*10)
    print(ret)
    Book.objects.all().update(price=F("price")+100)

    # Q
    ret=Book.objects.filter(title__startswith="java",price__gt=200)
    print(ret)
    ret = Book.objects.filter(Q(title__startswith="java")|~Q(price__lt=200))
    print(ret)
F查询与Q查询

ORM查询练习题

from django.db import models

# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)  # 999.99

    # 创建一对多的关联字段    :    是与某个书籍对象关联的出版社对象(注意,只有一个对象)
    publish = models.ForeignKey("Publish")

    # 创建的多对多的关系
    authors = models.ManyToManyField("Author")

    def __str__(self):
        return self.title


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name


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

    def __str__(self):
        return self.name


class AuthorDetail(models.Model):
    addr = models.CharField(max_length=32)
    email = models.EmailField()
    author = models.OneToOneField("Author")

    def __str__(self):
        return self.email
models.py
基于图书管理系统的表关系与数据,进行如下查询
  要求:1-5查询分别基于对象查询,双下划线查询,以及找到对应翻译的sql语句
   

  1、查询人民出版社出版过的价格大于100的书籍的作者的email
  2、查询alex出版过的所有书籍的名称以及书籍的出版社的名称
  3、查询2011年出版社过的所有书籍的作者名字以及出版社名称
  4、查询住在沙河并且email以123开头的作者写过的所有书籍名称以及书籍的出版社名称
  5、查询年龄大于20岁的作者在哪些出版社出版过书籍
  6、查询每一个出版社的名称以及出版过的书籍个数
  7、查询每一个作者的名字以及出版过的所有书籍的最高价格
  8、查询每一本书的名字,对应出版社名称以及作者的个数

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14. 以上是基于对象的查询

15.以下是基于QuerySet的查询

16.

 

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.DOM操作

35.

36.

37.

38.

39.

40.

41.

42.

43.

原文地址:https://www.cnblogs.com/shangdelu/p/8987882.html