ORM表表

ORM表和表之间的关系
    一对多           --> 外键(ForeignKey)
    多对多           --> 另外一张关系表(ManyToManyField)
        三种方式
            1.自己建立第三张关系表,外键分别关联两个表
            优点
                 可以扩充第三张关系标的字段
            缺点
                 自己做连表查询
            2.通过ORM内置的ManyToManyField,自动常见第三张关系表
            优点
                提供了很多连表操作的快捷方法--> all(), add(), set(), clear(), remove()
            缺点
                 无法扩展第三张关系表
                
            3.自己创建第三张关系表,通过ManyToManyField关联
            优点:
                 既能够使用多对多查询的快捷方法all(),还能够自己扩展第三张关系表的字段
以后该用哪种?
    当第三张关系表中不需要其他额外字段的时候,我们就用默认ManyToManyField就可以了
    当第三张关系表中需要额外的字段时,我们就要用第三种方式,自己建立第三张关系表并且用ManyToManyField关联
            
            
 一对一           --> OneToOneField    
 当一张表里的字段非常多,并且某几个字段的查询频率远远大于其他字段的时候
 把常用字段单独拆成一张表,查询的时候更快捷!
# 方式一:自行创建第三张表
class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
# 自己创建第三张表,分别通过外键关联书和作者
class Author2Book(models.Model):
    author = models.ForeignKey(to="Author")
    book = models.ForeignKey(to="Book")
    class Meta:
        unique_together = ("author", "book")

# 方式二:通过ManyToManyField自动创建第三张表
class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")
# 通过ORM自带的ManyToManyField自动创建第三张表
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to="Book", related_name="authors")

# 方式三:设置ManyTomanyField并指定自行创建的第三张表
class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")


# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
    # through_fields接受一个2元组('field1','field2'):
    # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。
class Author2Book(models.Model):
    author = models.ForeignKey(to="Author")
    book = models.ForeignKey(to="Book")
    class Meta:
        unique_together = ("author", "book")
多对多的三种方式
ORM关联查询
    1. 基于对象的查询
        1. 正向查
            对象.关联字段
        2. 反向查
            1. 默认不设置related_name属性
                1. 查找的对象是多个的时候(一对多或多对多时)
                    publisher_obj.book_set.all()
                2. 查找的对象时一个的时候(一对一)
                    author_info_obj.author.name
            2. 设置related_name='books'属性
                publisher_obj.books.all()
        
    2. 基于QuerySet的查询
        1. 正向查
                Book.objects.filter(id=1).values_list('publisher__name')
        2. 反向查
            1. 默认不设置related_name属性,默认就用类名的小写
                    Publisher.objects.filter(id=1).values_list('book__price')
            2. 设置related_name='books'属性
                    Publisher.objects.filter(id=1).values_list('books__price')

 

posted @ 2018-11-08 15:33  .why  阅读(328)  评论(0)    收藏  举报
Live2D