zoukankan      html  css  js  c++  java
  • models -- 多表

    • 示例表:
    from django.db import models
    
    class Publisher(models.Model):
        name = models.CharField(max_length=30, verbose_name="名称")
        address = models.CharField("地址", max_length=50)
        city = models.CharField('城市', max_length=60)
        state_province = models.CharField(max_length=30)
        country = models.CharField(max_length=50)
        website = models.URLField()
     
        class Meta:
            verbose_name = '出版商'
            verbose_name_plural = verbose_name
     
        def __str__(self):
            return self.name
     
    class Author(models.Model):
        name = models.CharField(max_length=30)
        
        def __str__(self):
            return self.name
     
    class AuthorDetail(models.Model):
        sex = models.BooleanField(max_length=1, choices=((0, '男'), (1, '女'),))
        email = models.EmailField()
        address = models.CharField(max_length=50)
        birthday = models.DateField()
        author = models.OneToOneField(Author)
     
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
        price = models.DecimalField(max_digits=5, decimal_places=2, default=10)
        
        def __str__(self):
            return self.title
    

    表之间的关系

    • Author和AuthorDetail   一对一,一个作者对应一个作者详情
    • Book和Author              多对多,一本书能有多个作者,一个作者能写多本书
    • Publisher和Book          一对多,一个出版社出版多本书,一本书只能在一个出版社出版

    增删改查

      • 增加Book表数据 -- 重点是对ForeignKey字段的处理
        • #方法一 
          #publisher_id是django自动生成的字段名
          Book.objects.create(
                  title='php',
                  publisher_id=2,   #这里的2是指为该book对象绑定了Publisher表中id=2的行对象,publisher_id是django自动在数据库中生成的字段名
                  publication_date='2017-7-7',
                  price=99
              )
          
        • #方法二
          #首先创建Publisher对象,然后绑定publisher=pub_obj
              pub_obj = Publisher(name='河大出版社', address='保定', city='保定',
                                  state_province='河北', country='China', website='http://www.hbu.com')
          
              pub_obj.save()
          
              Book.objects.create(
                  title='php',
                  publisher=pub_obj,  
                  publication_date='2017-7-7',
                  price=99
              )
          
        • #方法三
          #首先获取Publisher对象,然后绑定publisher=pub_obj    
              pub_obj = Publisher.objects.get(id=1)
          
              Book.objects.create(
                  title='php',
                  publisher=pub_obj,
                  publication_date='2017-7-7',
                  price=99
              )
          
      •  增加Book表数据 -- 对ManyToMany字段的处理

        • 如果第三张表是通过authors = models.ManyToManyField(Author)自动创建

          •     #方法一,正向添加的写法book.authors.add(*field)
                author1 = Author.objects.get(id=4)
                author2 = Author.objects.filter(name='Wang')[0]
                book = Book.objects.get(id=1)
            
                #添加两条数据到第三张表中
                book.authors.add(author1, author2)
            
                #等同于
                #book.authors.add(*[author1, author2])
            
          •   #方法二,反向添加的写法author.book_set.add(*field)
                author = Author.objects.get(id=8)
                books = Book.objects.filter(id__gt=1)
                author.book_set.add(*books)
            
              
        • 如果第三张表是自己手动创建,则可以使用增加ForeignKey数据的方法为第三张表添加数据

          • class Author(models.Model):
                name = models.CharField(max_length=30)
            
                def __str__(self):
                    return self.name
            
            class Book(models.Model):
                title = models.CharField(max_length=100)
                publisher = models.ForeignKey(Publisher)
                publication_date = models.DateField()
                price = models.DecimalField(max_digits=5, decimal_places=2, default=10)
            
                def __str__(self):
                    return self.title
            
            class Book2Author(models.Model):
                book = models.ForeignKey("Book")
                author = models.ForeignKey("Author")
            
                class Meta:
                    unique_together = ("book", "author")
            
      • 删除Book表数据 -- 级联删除
        • Book.objects.filter(id=3).delete()
          
      • 删除第三张表的数据 -- 通过ManyToMany字段删除
        • 第三张表是通过authors = models.ManyToManyField(Author)自动创建的
        • #方法一,正向删除
              get_authors = Author.objects.all()
              book = Book.objects.get(id=2)
              book.authors.remove(*get_authors)
          
        • #方法二,反向删除
              author = Author.objects.get(id=6)
              books = Book.objects.all()
              author.book_set.remove(*books)
          
      •  修改表数据

        • #方法一
              Author.objects.filter(id=3).update(name='xiaodong')
           
          #方法二
              obj = Author.objects.get(id=3)
              obj.name = 'xiaoze'
              obj.save()
          
      • 查询表数据 -- 通过对象查询
        • 正向查找 -- 查找编号为2的书的出版社所在城市
          •   book = Book.objects.filter(id=2)[0]
              book.publisher.city  #book.publisher是一个对象
            
          • 反向查找 -- 查找河大出版社出版的所有书
            •     publish = Publisher.objects.filter(name='河大出版社')[0]
                  publish.book_set.all().values('title')
              
        • 查询表数据 -- 通过双下划线查询
          • 正向查询
            • 一对多关系
              • 查找出版了php书的出版社其所在的城市
              •  Book.objects.filter(title='php').values("publisher__city")
                

                 返回:[{'publisher__city': '保定'}]

            • 多对多关系
              • 查找php书的作者名字
              • Book.objects.filter(title='php').values("authors__name")
                

                返回:[{'authors__name': 'xiaoze'}]

              • 查找作者是xiaoze的书

              • Book.objects.filter(authors__name='xiaoze').values('title')
                

                返回:[{'title': 'php'}]

            • publisher__city和authors__name中的publisher和authors是Book表中绑定的字段名

     

          • 反向查询
            • 一对多关系
              • 查找在保定的出版社其出版的书  
              • Publisher.objects.filter(city='保定').values("book__title")
                

                返回:[{'book__title': 'python'}]


            • 多对多关系
              • 查找php书的作者名字
              • Author.objects.filter(book__title='php').values('name')
                

                返回:[{'name': 'xiaoze'}]

              • 查找作者是xiaoze写的书
              • Author.objects.filter(name='xiaoze').values("book__title")
                

                返回:[{'book__title': 'php'}]

            • book__title中的book是表名Book的小写

  • 相关阅读:
    第二冲刺阶段第十四天
    第二冲刺阶段第十三天
    第二冲刺阶段第十二天
    第二冲刺阶段第十一天
    典型用户分析
    课后作业——搜狗输入法
    spring第二冲刺阶段第十五天
    spring第二冲刺阶段第十四天
    spring第二冲刺阶段第十三天
    spring第二冲刺阶段第十二天
  • 原文地址:https://www.cnblogs.com/dongmengze/p/9706597.html
Copyright © 2011-2022 走看看