zoukankan      html  css  js  c++  java
  • Django框架之ORM的相关操作之多对多三种方式(五)

    在之前的博客中已经讲述了使用ORM的多对多关系表,现在进行总结一下:

    1.ORM自动帮助我们创建第三张表

    2.手动创建第三张表,第三张表使用ForeignKey指向其他的两张表关联起来

    3.手动创建第三张表,使用的和ORM帮助我们创建的一样(这种方法暂时先不赘述)

    该博客重点讲一下第二种方法:手动创建第三张表,并且第三张表使用ForeignKey指向其他两张表关联起来

    以作者和出版的书进行举例子。作者可以写多本书,书也可以有多个作者,书与作者的关系就是多对多的关系

    1.创建两张各自的表(作者表和书籍表)

    class UserTest(models.Model):
        """
        作者表
        字段:id,作者名字
        """
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=20)
    
    
    class BookTest(models.Model):
        """
        书籍表
        字段:id,书籍名称
        """
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=20)

    目前这两张表属于没有任何关系的,接下来就要创建第三张表,使用第三张表让这两张表关联起来,本质就是使用第三张表记录作者表id和书籍表id分别当作外键

    class UserAndBook(models.Model):
        """
        第三张表
        字段:user字段是记录作者表的id,book字段是记录书籍表的id
        """
        id=models.AutoField(primary_key=True)
        user=models.ForeignKey(to="UserTest")
        book=models.ForeignKey(to="BookTest")

    查询id=1的作者出版的书有多少本

    (1)首先查询第三张表中user=1的所有信息,也就是id=1的作者。

    get_all_book_id=models.UserAndBook.objects.filter(user=1).values_list("book")

    这句表示获取UserAndBook表中所有user=1的信息,然后只需要查询book字段的数据,通过列表返回,在返回的列表对象中,每个元素都是一个元组。

    (2)此时拿到了id=1的作者名下的所有书籍id,由于(1)中取出来的get_all_book变量是一个列表,并且每个元素是一个元组,所以就需要讲每个书籍id都取出来,使用lambda表达式或者其他都可以

    ret=[i[0] for i in get_all_book_id]

    (3)拿到书籍的id查询书籍表

    show_all_books=models.BookTest.objects.filter(id__in=ret)

    此时就获取到了id=1作者下的所有书籍实例。

    ======================================================================

    第三种方法暂时不更新,等以后有时间再来补

    pass

    ======================================================================

    可能有同学问了,使用自动创建表不好吗,为什么手动创建,这里我解释一下,首先大家可以发现,自动创建的第三张表里面只记录了其他两张表对应的id,没有其他的字段了,但如果因为业务需要,需要在第三张表中添加几个字段,那么自动创建表就不是太符合我们的需求了,所以手动创建表就产生了作用了。

  • 相关阅读:
    stl的erase()陷阱--迭代器失效总结
    .NET Framework 概述
    C#在代码中编写输出debug信息-类Debug的使用
    C# 开发的windows服务 不能调试——讨论整理
    C#开发windows服务如何调试——资料整理
    iis深入学习资源
    网站因权限问题报错
    数据库建表经验总结——建表现象—sql查询疑惑
    java8大基本类型
    存储过程中的事务
  • 原文地址:https://www.cnblogs.com/fjiqiang/p/10936339.html
Copyright © 2011-2022 走看看