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的小写

 

 

        •  

 

转载于:https://www.cnblogs.com/dongmengze/p/9706597.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值