zoukankan      html  css  js  c++  java
  • django【orm操作】

    一、ORM表结构

     1 class Publisher(models.Model):
     2     name = models.CharField(max_length=30, verbose_name="名称")
     3     address = models.CharField("地址", max_length=50)
     4     city = models.CharField('城市',max_length=60)
     5     state_province = models.CharField(max_length=30)
     6     country = models.CharField(max_length=50)
     7     website = models.URLField()
     8  
     9     class Meta:
    10         verbose_name = '出版商'
    11         verbose_name_plural = verbose_name
    12  
    13     def __str__(self):
    14         return self.name
    15  
    16 class Author(models.Model):
    17     name = models.CharField(max_length=30)
    18     def __str__(self):
    19         return self.name
    20  
    21 class AuthorDetail(models.Model):
    22     sex = models.BooleanField(max_length=1, choices=((0, ''),(1, ''),))
    23     email = models.EmailField()
    24     address = models.CharField(max_length=50)
    25     birthday = models.DateField()
    26     author = models.OneToOneField(Author)
    27  
    28 class Book(models.Model):
    29     title = models.CharField(max_length=100)
    30     authors = models.ManyToManyField(Author)
    31     publisher = models.ForeignKey(Publisher)
    32     publication_date = models.DateField()
    33     price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
    34     def __str__(self):
    35         return self.title

      

    二、ORM增加数据

    from app01.models import *
    
    一、单表增加数据
        #create方式一:   Author.objects.create(name='Alvin')
        #create方式二:   Author.objects.create(**{"name":"alex"})
        #save方式一:     author=Author(name="alvin")
                                author.save()
        #save方式二:     author=Author()
                                author.name="alvin"
                                author.save()
    
    二、1对多增加数据 
        #方式一:
        #Book.objects.create(title='vb',publisher_id=1, publication_date="2016-7-7",price=198)
        #方式二:
        #publisher_obj = Publisher.objects.get(id=3)
        #Book.objects.create(title='vb',publisher=publisher_obj, publication_date="2016-7-7",price=198)
        备注:将 publisher_id=2 改为  publisher=publisher_obj
    
    三、多对多增加数据
        1.#为id=1这本书增加2个作者。将数据增加到第三张表中
           # 正向增加
        author1=Author.objects.get(id=1)
        author2=Author.objects.filter(name='alvin')[0]
        book=Book.objects.filter(id=1)[0]
        book.authors.add(author1,author2)
       
        2.#反向增加
           #将多本书增加到一个作者
        book=models.Book.objects.filter(id__gt=1)
        authors=models.Author.objects.filter(id=1)[0]
        authors.book_set.add(*book)
        authors.book_set.remove(*book)
     
        3.如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式
        #如果第三张表是自己创建的:
         class Book2Author(models.Model):
                author=models.ForeignKey("Author")
                Book=  models.ForeignKey("Book")
        #那么就还有一种方式:
                author_obj=models.Author.objects.filter(id=2)[0]
                book_obj  =models.Book.objects.filter(id=3)[0]
    
           s=models.Book2Author.objects.create(author_id=1,Book_id=2)
                s.save()
                s=models.Book2Author(author=author_obj,Book_id=1)
                s.save()

    三、ORM删除数据

    1.删除BOOK表id=1的数据
        Book.objects.filter(id=1).delete()

    2.删除一个出版社. 注意与出版相关联的书也会被删除 
      Publisher.objects.filter(id=3).delete()
    3.删除id=6这本书和作者id=1的关联(删除第三张关系表数据) book = Book.objects.filter(id=6)[0] # 找到这本书的对象 author = Author.objects.filter(id=1)[0] # 找到这个作者的对象 author.book_set.remove(book) # 反向删除 book.authors.remove(author) # 正向删除

    四、ORM更新数据

    1.对象更新(所有字段更新,性能低)
        ret = Publisher.objects.get(id=2)
        ret.name = "复旦大学"
        ret.save()
    
    2.级联方法更新
        Publisher.objects.filter(id=1).update(city="北京市")

    五、ORM查询数据

    1.了不起的双下划线(__)之单表条件查询
    # models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
    #
    # models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
    # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
    #
    # models.Tb1.objects.filter(name__contains="ven")
    # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
    #
    # models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
    #
    # startswith,istartswith, endswith, iendswith,
    
    2.了不起的双下划线(__)之多表条件关联查询
    # 正向查找(条件)
    
    # ret3=models.Book.objects.filter(title='Python').values('id')
    # print(ret3)#[{'id': 1}]
    #正向查找(条件)之一对多      ret4=models.Book.objects.filter(title='Python').values('publisher__city')
          print(ret4)  #[{'publisher__city': '北京'}]
    
    #正向查找(条件)之多对多
          ret5=models.Book.objects.filter(title='Python').values('author__name')
          print(ret5)
          ret6=models.Book.objects.filter(author__name="alex").values('title')
          print(ret6)
    
          #注意
          #正向查找的publisher__city或者author__name中的publisher,author是book表中绑定的字段
          #一对多和多对多在这里用法没区别
    
    # 反向查找(条件)
    
        #反向查找之一对多:
        ret8=models.Publisher.objects.filter(book__title='Python').values('name')
        print(ret8)#[{'name': '人大出版社'}]  注意,book__title中的book就是Publisher的关联表名
    
        ret9=models.Publisher.objects.filter(book__title='Python').values('book__authors')
        print(ret9)#[{'book__authors': 1}, {'book__authors': 2}]
    
        #反向查找之多对多:
        ret10=models.Author.objects.filter(book__title='Python').values('name')
        print(ret10)#[{'name': 'alex'}, {'name': 'alvin'}]
    
        #注意
        #正向查找的book__title中的book是表名Book
        #一对多和多对多在这里用法没区别
  • 相关阅读:
    真的是简单、简洁、简易、简明之道!!!
    HashMap源码解读
    Jenkins Pipeline
    C语言二级指针free|一级指针存储内存地址
    openjdk编译和调试,JVM编译调试
    java linux和win jdk安装包jdk1.6、jdk1.7和jdk1.8 7u80 8u181 8u161
    关于java代码打包成jar在控制台运行变慢的问题
    Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen
    mongodb副本集
    condition
  • 原文地址:https://www.cnblogs.com/weibiao/p/6871803.html
Copyright © 2011-2022 走看看