美文网首页
Django_ORM CRUD

Django_ORM CRUD

作者: 钱塘 | 来源:发表于2017-08-18 15:36 被阅读6次

    model表模型

    # coding=utf8
    
    from django.db import models
    
    
    # Create your models here.
    
    
    class Book(models.Model):
        title = models.CharField(max_length=64)
        price = models.IntegerField()
        color = models.CharField(max_length=64)
        page_num = models.IntegerField(null=True)
        publisher = models.ForeignKey("Publisher")  # 一对多关系
        # publisher名字可以自己定义
        # django会自己加一个_id,自己插入的时候也要加id
    
        author = models.ManyToManyField("Author")  # 多对多关系
    
        def __str__(self):
            return self.title
    
    
    class Publisher(models.Model):
        name = models.CharField(max_length=64)
        city = models.CharField(max_length=63)
    
        def __str__(self):
            return self.city
    
    
    class Author(models.Model):
        name = models.CharField(max_length=30)
    
        def __str__(self):
            return self.name
    
    

    创建表

    1 创建单表:

    这张表和其他表没有关系

    2 创建关联表 | 外键
    • 一对一
    • 一对多 (重点)(ForeignKey)
    • 多对多 (重点)(ManyToMany)

    一个类对应一张表,类实例出来的对象对应每一行的数据。

    没有外键时:
    
            方式一:   models.Author.objects.create(name='Alvin')
            方式二:   dic = {"name":"alex","age":"27"} 
                     models.Author.objects.create(**dic)
    
    如果有外键:
    
         一对多:  
                 (1). modles.Book.objects.create(title='python',price=12,publisher_id=2)
                  
                  #publisher后在加_id,这是django自行实现的 (推荐)
    
                 (2). modles.Book.objects.create(title='python',price=12,publish = obj) #object 
    
    
         
        多对多:
                将两者的外键取出来另建第三张表,含有三列: id book_id publisher_id  
                绑定:add() 取消:remove()
                
                ---- 正向查询
                book = models.Book.objects.filter(id=2)[0]
                authors = models.Author.objects.filter(id__gt=2)
                book.author.add(*authors)  //因为是序列,所以要加*
                
                //移除 book.author.remove(*authors)
                
                ---- 反向查询
                author=models.Author.objects.filter(id=2)[0]
                books=models.Book.objects.filter(author__gt=2)
                author.book_set.add(*books)
               
               //移除 author.book_set.remove(*books)
                    
    实例2
    
              * 涉及多对多关系  增加对象 
    
    
            name = request.POST.get('name')     # 此处name是一个对象 代表1
            cls = request.POST.getlist('cls')   # 此处cls是一个列表 代表多
            # print(name,cls)
            obj = models.Teacher.objects.create(name=name)  #创建对象1
            obj.cls.add(*cls)                  # 增加对象关联的班级          
    
    
    
    * 涉及多对多关系  增加对象 
    
    
            name = request.POST.get('name')     # 此处name是一个对象 代表1
            cls = request.POST.getlist('cls')   # 此处cls是一个列表 代表多
            # print(name,cls)
            obj = models.Teacher.objects.create(name=name)  #创建对象1
            obj.cls.add(*cls)                  # 增加对象关联的班级          
    
    
    1. 查对象的一个属性
    
            obj = models.Classes.objects.all().value('id')
    
    * 重设多的属性 
    
            cls_li = request.POST.getlist('cls')
            obj = models.Teacher.objects.get(id=nid)
            obj.name = name
            obj.cls.set(cls_li)
    

    反向查询

    #### book_set是一个query_set,当author表里没有book字段时,用book_set来查询book   
            
    #### 自己写第三张表
    

    一对一 : 在一对多的基础上,对多的xxx_id上添加一个unique=ture + Foreignkey
    多对多 : 利用两个Foreignkey实现

    一对多: 对于book只有一个publisher 外键建在多的一方

        # 一对多关系
        # publisher名字可以自己定义
        # django会自己加一个_id,自己插入的时候也要加id
    

    多对多: 外键可以建在两者中任意一个,ManyToMany会自动创建第三张表

    删:

        Book.objects.filter(id=1).delete()
    

    改:

        models.Book.objects.filter(id=3).update(title="PHP")
        ##sql:
        ##UPDATE "app01_book" SET "title" = 'PHP' WHERE "app01_book"."id" = 3; args=('PHP', 3)
    

    查:

        obj = Book.objects.filter(id=4)[0].values("price")
    
        <1>filter(**kwargs):      它包含了与所给筛选条件相匹配的对象
    
        <2>all():                 查询所有结果
    
        <3>get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
        
        book = models.Book.objects.filter(id=2)[0]
    
        dic = {xx:xx}
        book = models.Book.objects.filter(**dic)
    
        authors = models.Author.objects.filter(id__gt=2)
        books=models.Book.objects.filter(author__gt=2)
        books=models.Author.objects.filter(id=1).book_set

    相关文章

      网友评论

          本文标题:Django_ORM CRUD

          本文链接:https://www.haomeiwen.com/subject/bslarxtx.html