• Django之Models(三)


    Django之Models(三)

    创建多对多关系

    第一种方式:创建多对多的关系authors=models.ManyToManyField("Author")

    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        city = models.CharField('城市',max_length=60)
        
    
    class Book(models.Model):
        name=models.CharField(max_length=20)
        price=models.IntegerField()
        pub_date=models.DateField()
        publisher= models.ForeignKey(Publisher,on_delete=models.SET)
        authors=models.ManyToManyField("Author")
        
    class Author(models.Model):
        name=models.CharField(max_length=32)
        address=models.CharField(max_length=32)
    View Code

    第二种方式:手动创建第三张表,不推荐

    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        city = models.CharField('城市',max_length=60)
        
    
    class Book(models.Model):
        name=models.CharField(max_length=20)
        price=models.IntegerField()
        pub_date=models.DateField()
        publisher= models.ForeignKey(Publisher,on_delete=models.SET)
        
    
    
    class Author(models.Model):
        name=models.CharField(max_length=32)
        address=models.CharField(max_length=32)
        
    
    class Book_Author(models.Model):
           book=models.Foreignkey('Book')
           author=models.Foreignkey('Author')
    View Code

    补充:

    如果想向第三张表插入的方式绑定关系:手动创建第三张表

    关联字段
    Book_Author.objects.create(book_id=2,authos_id=3)
    
    
    
    book_obj=Book.objects.get(id=2)
    #借助第三张表来查询关联信息
    print(book_obj.Book_author_set.all()[0].author)
    
    
    
    
    lili出过的书籍名称及价格
    第三张表_关联表_字段 
    Book.objects.filter(book_author_author_name="lili")
    View Code

    绑定多对多关系

    book_obj=Book.objects.get(id=2)
    authoor_obj=Author.objects.get(id=2)
    book_obj.authors.add(author_obj)
    
    
    book_obj=Book.objects.get(id=2)
    authoor_objs=Auther.objects.all()
    book_obj.authors.add(*author_objs)
    

      

    解除多对多关系

    book_obj=Book.objects.get(id=2)
    authoor_objs=Auther.objects.all()
    book_obj.authors.remove(*author_objs)
    
    
    
    book_obj=Book.objects.get(id=2)
    authoor_obj=Author.objects.get(id=2)
    book_obj.authors.remove(authoor_obj)
    

      

    查询数据

    对象查询:
    
    获取id为3的书籍的作者信息
    book_obj=Book.objects.get(id=3)
    book_obj.authors.all()
    
    获取id为2的作者写的书的信息
    author_obj=Author.objects.get(id=2)
    author_obj.book_set.all()
    

      

    掌握:通过 filter values (双下划线)进行多对多的关联查询

    #正向查找(条件)之多对多
          ret1=models.Book.objects.filter(name='python').values('author__name')
          print(ret1)
          ret2=models.Book.objects.filter(author__name="lili").values('name')
          print(ret2)
    
    
    #反向查找之多对多:
        ret3=models.Author.objects.filter(book__name='python').values('name')
        print(ret10)

    聚合与分组

    聚合 
    
    先导入:from django.db.models import Avg,Min,Max,Count
    
    ggregate(*args,**kwargs):
    通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。
    
    
    ret1=Book.object.all().aggregate(Avg('price'))
    print(ret1)
    
    ret2=ret1=Book.object.all().aggregate(Sum('price'))
    print(ret2)
    
    
    Book.objects.filter(authors_name="lili").aggregate(Sum("price"))
    
    
    Book.objects.filter(authors_name="lili").aggregate(lili_money=Sum("price"))
    
    
    
    Book.objects.filter(authors_name="lili").aggregate(Count('price'))
    
    
    
    分组
    annotate(*args,**kwargs):
      可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。
    
    Book.objects.values("authors_name").annotate(Sum("price"))
    
    
    Publish.objects.values('name').annotate(Min("book_price"))
    View Code
  • 相关阅读:
    正则判断是否为字母数字汉字
    lucene3.0范围查找TermRangeQuery
    【codecombat】 试玩全攻略 第三关幽灵守卫
    【codecombat】 试玩全攻略
    【codecombat】 试玩全攻略 特别关:不祥的征兆
    【codecombat】 试玩全攻略 第一关kithguard地牢
    【codecombat】 试玩全攻略 第四关 真实姓名
    【codecombat】 试玩全攻略 第二关深藏的宝石
    【codecombat】 试玩全攻略 第五关 高举之剑
    python读书笔记
  • 原文地址:https://www.cnblogs.com/-wenli/p/10424770.html
Copyright © 2020-2023  润新知