[django]django的orm查询

models操作

参考

思路:

给publish插数据
给book插数据
给author插数据

给book_author插数据
    调用外键:     Book.publish # 这本书对应出版社的一条记录(对象)
    调用多对多键: Book.author  # 这本书绑定关系的作者的记录(queryset)
    book_obj.author.all()
    book_obj.author.add(author_obj)
    book_obj.author.remove(author_obj)

    author_obj = Author.objects.all()
    book_obj.author.add(*author_obj)
    
通过book找它的author: 
    python这本书的作者
        Author.objects.filter(book__name="python")

通过author找它的book
    龟叔出过的书的name+price(用系统自带的manytomany方法)
        Book.objects.filter(author__name="龟叔").values('name', 'price')


自定义book_author表:
    查出id=2的book的author:(两张表借助第三张表book_author取数据)
    
    方法1:
        book_obj = Book.objects.get(id=2)
        book_obj.book_author_set.all() # book_author的queryset对象
        print(book_obj.book_author_set.all()[0].author) # 查出作者.
    方法2:
        Book.objects.filter(book_author__author_id__name="龟叔").values('name','price')
多对多:
    创建多对多关系:
        author = models.ManytoManyFiled("Author")
        
    book对象它的所有的关联作者: obj = book_obj.authors.all()
        绑定多对多的关系:       obj.add(*QuerySet)
                                obj.add(author_obj)
        如果想向第三张表插入值的方式绑定:
            手动创建第三张表
                class Book_Author(models.Model):
                    book_id = models.ForeignKey(Book, on_delete=models.CASCADE)
                    author_id = models.ForeignKey(Author, on_delete=models.CASCADE)
                Book_Author.objects.create(book_id=2,author_id=3)
    掌握: 通过filter value(双下划线)实现多对多的关联查询
        龟叔出过的书的name+price(用系统自带的manytomany方法)
            Book.objects.filter(author__name="龟叔").values('name', 'price')
1.聚合
2.分组
3.F查询和Q查询
多表查询:
    一对多
        1,sql
        2,set
        3,__
            图书---2种-->出版社
            图书<--1种--出版社

    多对多
        1,自动
            操作第三张表, 为第三张表添加记录.
            调用外键:     Book.publish # 这本书对应出版社的一条记录(对象)
            
            调用多对多键: Book.author  # 这本书绑定关系的作者的记录(对象)
        2,手动
        
        通过book找它的author
        通过author找它的book
        
        给book添加author记录
            即手动添加book_author关系
                1,取出一本书 book_obj
                2,取出一个作者author_obj
                3,book_obj.add(author_obj)

F查询和Q查询
1.创建
    1,p = People
      p.name = "mt"
      p.save()
    2,People.objects.create(name="mt")

2.查询(重点****)
    def home(request):
        book_list = Book.objects.filter(id=1)
        book_list = Book.objects.exclude(author='maotai').values('name', 'price')
        
        # filter/all 取出的是一个queryset
        book_list = Book.objects.all()
        book_list = Book.objects.all()[::2]
        book_list = Book.objects.all()[::-1]

        # first/last get取到的是一个实例
        book_list = Book.objects.first()
        book_list = Book.objects.last()
        book_list = Book.objects.get(id=1) # 结果超过一个后会报错

        res = Book.objects.filter(author='maotai').values("name")              # 结果是字典形式,kv
        res = Book.objects.filter(author='maotai').values_list("name","price") # 结果是列表形式,好像只有key
        # select name from book where author='maotai';

        book_list = Book.objects.filter(author='maotai').values("name").distinct() # filter某些字段时, 去重
        book_count = Book.objects.all().values("name").count()   # 记录条数
        
        # 模糊匹配
        book_list = Book.objects.filter(name__contains="mao").values_list("name","price")
        book_list = Book.objects.filter(id__gt=5).values_list('name','price')

3,删除
    book_list = Book.objects.exclude(author='maotai').delete()

- 方法小结:
all()&filter()
    queryset.update()
    queryset.delete()

first/last&get
    obj.save()
思路:
创建publish出版社/图书表(一对多)---添加图书的两种方法(主要是给publish_id赋值)
                                    1, 
                                        Book.objects.create(name="流畅的python", price=89, pub_date="2017-06-06", publish_id=3)
                                    2, 
                                        publish_obj = Publish.objects.filter(name="人民出版社")[0]
                                        Book.objects.create(name="go action", price=22, pub_date="2018-04-04", publish=publish_obj)
-
1. 通过book查publish消息?
    1,def __str__
    2,查询publish的其他字段
    
2. 查看人民出版社出版过哪些书?
    1,方法1: 正向
    2,方法2: 逆向查: 利用django自带的book_set
    
多表操作(一对多):
    1,正向查询
        pub_obj = Publish.objects.get(name="人民出版社")
        res = Book.objects.filter(publish=pub_obj).values('name', 'price')
    2,逆向查询,利用django提供的book_set
        pub_obj = Publish.objects.filter(name="人民出版社")[0]
        print(pub_obj.book_set.all())
        print(type(pub_obj.book_set.all()))

- 
外键两种写法:
    1,外键加引号
        publish = models.ForeignKey("publish", on_delete=models.CASCADE, verbose_name="出版社")
    2,外键不加引号.(外键model需要先定义)
        publish = models.ForeignKey(Publish, on_delete=models.CASCADE, verbose_name="出版社")




通过__方法查找结果:
    1,逆向查找: 外键__名称
    - 查出人民出版社出版的图书
    res = Book.objects.filter(publish__name="人民出版社").values('name', 'price') # 这里的publish是外键名
    print("3,通过__方法查找结果: ", res)
    print("-" * 50)

    2,正向查找: 主表__name
    2.1
    # python这本书的出版社名字
    print(Publish.objects.filter(book__name="python").values('name')) # 这里的book是表名, 这里name是publish表里的字段name
    return HttpResponse("查询完毕, 结果请查看console")

    2.2通过逆向查
    res = Book.objects.filter(name="python").values("publish__name") # select publish__name


栗子
思路: 一对多: 这个出版社出版过哪些书? -- 这本书是哪个出版社出版的?
      多对多: id=3的作者的信息

    1. 人民出版社出版的图书的名字
        1.1
        pub_obj = Publish.objects.get(name="人民出版社")
        res = Book.objects.filter(publish=pub_obj).values('name', 'price')
        
        1.2
        pub_obj = Publish.objects.filter(name="人民出版社")[0]
        print(pub_obj.book_set.all())
        
        1.3
        res = Book.objects.filter(publish__name="人民出版社").values('name', 'price')
    

    2. python这本书的出版社名字
        2.1逆向(主表名__)
        res = Publish.objects.filter(book__name="python").values('name')
    
        2.2正向(外键名__)
        res = Book.objects.filter(name="python").values("publish__name")

    3. 在北京出版社出版的书
    Book.objects.filter(publish__city__="北京").values('name')
    
    4. 2017年上半年出的书的出版社名字
    res = Book.objects.filter(pub_date__lt="2017-07-01", pub_date__gt="2017-01-01").values('publish_name')

    5, 多对多的关系, id=3的所有作者信息
    book_obj = Book.objects.get(id=3)
    book_obj.author.all()
    print(type(book_obj.author.all()))

数据模拟:

- models

class Publish(models.Model):
    name = models.CharField(max_length=40, verbose_name="出版社")
    city = models.CharField(max_length=40, verbose_name="出版社所在城市")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "出版社"
        verbose_name_plural = verbose_name


class Author(models.Model):
    name = models.CharField(max_length=40, verbose_name="作者")
    age = models.IntegerField(default=17, verbose_name="年龄")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "作者"
        verbose_name_plural = verbose_name


class Book(models.Model):
    name = models.CharField(max_length=40, verbose_name="书名")
    price = models.IntegerField(default=99, verbose_name="价格")
    pub_date = models.DateField(verbose_name="出版时间")
    publish = models.ForeignKey(Publish, on_delete=models.CASCADE, verbose_name="出版社")

    # author = models.ManyToManyField(Author, verbose_name="作者")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "图书"
        verbose_name_plural = verbose_name


class Book_Author(models.Model):
    book_id = models.ForeignKey(Book, on_delete=models.CASCADE)
    author_id = models.ForeignKey(Author, on_delete=models.CASCADE)
- views

def addbook(request):
    # 1.创建出版社
    # Publish.objects.create(name="人民出版社",city="北京")
    #
    # p = Publish()
    # p.name = "邮电出版社"
    # p.city = "西安"
    # p.save()
    #
    # p2 = Publish(name="机械出版社")
    # p2.city = "上海"
    # p2.save()
    #
    # print(Publish.objects.all())

    # 2,创建图书
    # Book.objects.create(name="python", price=89,pub_date='2017-01-07', publish_id=1)
    # Book.objects.create(name="go", price=99, pub_date='2017-04-01',publish_id=2)
    # Book.objects.create(name="ios", price=39,pub_date='2017-06-01', publish_id=3)
    # Book.objects.create(name="java", price=69, pub_date='2017-12-24',publish_id=3)

    # 3,创建作者
    # Author.objects.create(name="龟叔",age=17)
    # Author.objects.create(name="林纳斯",age=20)
    # Author.objects.create(name="毛台",age=25)
    # Author.objects.create(name="Jeff",age=33)

    # 龟叔还写了ios
    # book_obj = Book.objects.get(name="ios")
    # author_obj = Author.objects.get(id=1)
    # print(book_obj.author.all()) # ios谁写的?
    # # book_obj.author.add(author_obj)

    # 龟叔出过的书
    # res = Book.objects.filter(author__name="龟叔").values('name', 'price')
    # print(res)
    #
    # # python这本书谁写的
    # res2 = Author.objects.filter(book__name="python")
    # print(res2)
    #
    Book_Author.objects.create(book_id=2,author_id=1)

    book_obj = Book.objects.get(id=2)
    # book_obj.book_author_set.all() # book_author的queryset对象
    print(book_obj.book_author_set.all()[0].author)

    Book.objects.filter(book_author__author_id__name="龟叔").values('name','price')


    # 创建自定义book_author表
    Book.objects.filter(book_author__author__name="alex").values("name","price")
    return HttpResponse("结果请查看console")

猜你喜欢

转载自www.cnblogs.com/iiiiiher/p/8910595.html