• django中orm之什么是正向查询什么是反向查询


    Publish

    class Publish(models.Model):

      nid = models.AutoField(primary_key=True)

      name=models.CharField( max_length=32)

      city=models.CharField( max_length=32)

      email=models.EmailField()

    表 Book

    class Book(models.Model):

      nid = models.AutoField(primary_key=True)

      title = models.CharField( max_length=32)

      publishDate=models.DateField()

      price=models.DecimalField(max_digits=5,decimal_places=2)

      # 与Publish建立一对多的关系,外键字段建立在多的一方,字段publish如果是外键字段,那么它自动是int类型
           publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE) #foreignkey里面可以加很多的参数,都是需要咱们学习的,

      慢慢来,to指向表,to_field指向你关联的字段,不写这个,默认会自动关联主键字段,on_delete级联删除
      字段名称不需要写成publish_id,orm在翻译foreignkey的时候会自动给你这个字段拼上一个_id,这个字段名称

      在数据库里面就自动变成了publish_id # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表,并且注意一    点,你查看book表的时候,你看不到这个字段,因为这个字段就是创建第三张表的意思,不是创建字段          的意思,所以只能说这个book类里面有authors这个字段属性
          authors=models.ManyToManyField(to='Author',) #注意不管是一对多还是多对多,写to这个参数的时候,最后后面的值是个字符串,不然你就需要将你要关联的那个表放到这个表的上面

    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")

    跨表查询是分组查询的基础,F和Q查询是最简单的,所以认真学习跨表查询

      一对多查询(Publish 与 Book)

        

        正向查询(按字段:publish):关联属性字段所在的表查询被关联表的记录就是正向查询,反之就是反向查询

    # 查询主键为1的书籍的出版社所在的城市
    book_obj=Book.objects.filter(pk=1).first()
    # book_obj.publish 是主键为1的书籍对象关联的出版社对象,book对象.外键字段名称
    print(book_obj.publish.city)  

        反向查询(按表名:book_set,因为加上_set是因为反向查询的时候,你查询出来的可能是多条记录的集合):

    publish=Publish.objects.get(name="苹果出版社")
    #publish.book_set.all() : 与苹果出版社关联的所有书籍对象集合,写法:小写的表名_set.all(),得到queryset类型数据
    book_list=publish.book_set.all()    
    for book_obj in book_list:
           print(book_obj.title)
  • 相关阅读:
    Windows Phone 7(WP7)开发 自订磁贴(深度链接)
    Windows Phone 7(WP7)开发 在ViewModel中使用NavigationService
    Windows Phone 7(WP7)开发 显示长文本(高度大于2000px)
    类属性生成器(小程序)
    Windows Phone 7(WP7)开发 ListBox的分页加载
    Windows Phone 7(WP7)开发工具 查看独立存储空间中数据库内容
    Windows Phone 7(WP7)开发 获取网络状态
    发布一个XNA写的小雷电源码
    用python来个百度关键词刷排名脚本
    win7下 VirtualBox虚拟机开机后台自启动
  • 原文地址:https://www.cnblogs.com/xingkongzhizhu/p/12936392.html
Copyright © 2020-2023  润新知