• Django ORM 一对多操作


    创建表

    # models.py
    
    form django.db import models
    
    class Book(models.Model):  # 表名book,django会自动使用项目名+我们定义的表名
      # 如没有自定义主键,django会自动添加一个主键,字段名id 自增
      name = models.CharField(max_length=20)  # 字段名name 类型 vachar(20)
      price = models.IntegerField()   # 字段名price 类型int
      pub_date = models.DateField()   # 字段名pub_date 类型 date (时间戳)
      publish = models.ForeighKey('Publish',related_name='xxx')  # 创建外键关联到Publish表的id字段,django会自动将该名称改为publish_id  这里的publish可以代指Publish中的一行数据(name city),即Publish的一个实例对象
    # related_name='xxx' 表示能过publish来找book时使用的名称,默认为book_set(反向查询时使用)
    # 如果这样写 publish = models.ForeighKey(Publish) 括号内无引号,则必须将Publish类放到Book类的上面
      def __str__(self):     return self.name  # 打印实例对象时显示为self.name

    class Publish(models.Model):
      name = models.CharField(max_length=32)
      city = models.CharField(max_length=32)

    一对多的添加

    # views.py
    
    from django.shortcuts import render
    from app_name.models import *  # 导入models.py
    
    def add(request):  # 增加数据的视图函数
      # 方式一 直接对publish_id赋值
      Book.objects.create(name='Linux基础',price=99,author='yuan',pub_date='2017-12-12',publish_id=2)  # 一次数据库操作,推荐
      # 方式二 通过创建一个publish的对象直接对publish赋值
    publish_obj = Publish.objects.filter(name='人民出版社')[0]  # ==>
    publish_obj = Publish.objects.filter(name='人民出版社').first()
      Book.objects.create(name='Linux基础',price=99,author='yuan',pub_date='2017-12-12',publish=publish_obj)  # 两次数据库操作
      return HttpResponse('添加成功')

    得出结论:1.publish_id 对应一个数字
    2.publish对应一个publish的实例对象  

    一对多的查询

    # 怎么使用一对多查询呢?
    book_obj = Book.objects.get(name='python')
    print(book_obj.name)  # python
    print(book_obj.publish)  # Publish object  是与book对应的Publish的对象
    print(type(book_obj.publish))  # <class 'app01.models.Publish'>

    # 获取所有人民出版社的书(通过对象)
    # 通过书来找出版社(子表找主表)正向查询,使用FK 推荐
    publish_obj = Publish.objects.get('人民出版社')
    ret = book_obj=Book.objects.filter(publish=publish_obj)
    # 通过出版社来找书 (主表找子表) 反向查询 使用 子表__set 或 related_name
    publish_obj = Publish.objects.get('人民出版社')[0]
    ret = publish_obj.book_set.all()  # 通过publish对象去找book表中其所有对应的数据 (book_set对就的就是子表book的书的集合,通过定义FK时的参数related_name来定义这个名字)

    # 通过双下划线查询 (可以用在filter与values中)
    1.获取所有人民出版社的书
    Book.objects.filter(publish__name='人民出版社')
    Publish.objects.filter(name='人民出版社').values('book__name')
    2.获取python这本书出版社的名字
    Publish.objects.filter(book__name='python')
    Book.objects.filter(name='python').values('publish__name')
    3.获取所有北京的出版社出过所有的书
    Book.objects.filter(publish__city='北京')
    Publish.objects.filter(city='北京').values('book__name')

    注意:1、使用filter与values时,如果要取publish中的内容,可使用双下划线进行跨表 如publish__name
       2、使用for 遍历由filter或all得出的QuerySet时。使用点进行跨表,因为publish相当于一个对象,则使用publish.name
       3、使用for 遍历由values得出的QuerySet时,因为QuerySet中是一个一个字典,使用下标进行取值 如 row['name']
       3、在模板中只能使用点
  • 相关阅读:
    冒泡排序、选择排序、简单二分查找
    asp.net和js读取文件的MD5值的方法
    C#对.CSV格式的文件--逗号分隔值文件 的读写操作及上传ftp服务器操作方法总结
    利用jQueryRotate旋转插件开发大转盘抽奖
    说说第三方支付接口开发及开发中遇到的坑爹问题
    浅谈程序员接私单那点事及接私单需要注意的问题
    C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
    C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询
    C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)
    C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
  • 原文地址:https://www.cnblogs.com/dangrui0725/p/9615641.html
Copyright © 2020-2023  润新知