一对多

在 models.py 上定义:

class Province(models.Model):
name = models.CharField(max_length=32) def __str__(self):
return self.name class City(models.Model):
name = models.CharField(max_length=32)
pro = models.ForeignKey("Province", to_field='id', on_delete=models.CASCADE) def __str__(self):
return self.name

执行语句生成数据库

python manage.py makemigrations

python manage.py migrate

修改 urls.py 添加一个url

    path('test.html', views.test),

在 views.py 上添加

from app01 import models

def test(req):
# 添加数据
# models.Province.objects.create(name='河北')
# models.Province.objects.create(name='广东')
# models.Province.objects.create(name='山东')
# models.City.objects.create(name='东莞', pro_id=2)
# models.City.objects.create(name='深圳', pro_id=2)
# models.City.objects.create(name='惠州', pro_id=2)
# models.City.objects.create(name='河源', pro_id=2)
# models.City.objects.create(name='泰安', pro_id=3)
# models.City.objects.create(name='青岛', pro_id=3)
# models.City.objects.create(name='济南', pro_id=3)
# models.City.objects.create(name='张家口', pro_id=1)
# models.City.objects.create(name='邢台', pro_id=1) # 正向查找(具有外键字段的)
v = models.City.objects.values('id', 'pro__city', 'pro__city__name', 'pro__name')
print(v)
# 截取一部分结果: {'pro__name': '河北', 'pro__city__name': '张家口', 'id': 8, 'pro__city': 8}...... # 反向查找
l = models.Province.objects.values('id', 'name', 'city__name')
print(l)
# 截取一部分结果: {'id': 1, 'name': '河北', 'city__name': '张家口'} , {'id': 1, 'name': '河北', 'city__name': '邢台'}.... # 获取 province 所有的值
pro_list = models.Province.objects.all()
print(pro_list)
# 结果:<QuerySet [<Province: 河北>, <Province: 广东>, <Province: 山东>]> # 获取所有 省份 并且 城市id 都小于5的值
for item in pro_list:
print(item.id, item.name, item.city_set.filter(id__lt=5)) # 获取第一个省份和其所有的城市
print(pro_list[0])
print(pro_list[0].city_set.all())
# 结果:
# 河北
# <QuerySet [<City: 张家口>, <City: 邢台>]> return HttpResponse('ok')

多对多

在 models.py 上定义:

class Book(models.Model):
name = models.CharField(max_length=32) class Author(models.Model):
name = models.CharField(max_length=32)
m = models.ManyToManyField('Book')

执行语句生成数据库

python manage.py makemigrations

python manage.py migrate

在 views.py 上添加

def test(req):
# 正向查找,获取 Author id 为1 的所有著作
obj = models.Author.objects.get(id=1)
l = obj.m.all()
for item in l:
print(item.id, item.name) # 反向查找,获取 著作为 1 的作者
obj = models.Book.objects.get(id=1)
m = obj.author_set.all()
for item in m:
print(item.id, item.name) return HttpResponse('ok')

插入数据

author:



book:



author_m:

运行结果:

添加数据,进行查询操作

修改 views.py

    # 或者作者和其对应的所有著作
author_list = models.Author.objects.all()
for author in author_list:
print(author.name, author.m.all())

    # 通过第三张表 m 来查询数据
author_list = models.Author.objects.values('id', 'name', 'm', 'm__name')
for item in author_list:
print(item['id'], item['name'], '书籍ID:', item['m'], item['m__name'])

第三张表中添加一个对应关系

    # 增加
obj = models.Author.objects.get(id=1)
obj.m.add(5)
obj.m.add(4, 5)
obj.m.add(*[4, 5]) # 删除
obj.m.remove(5)
obj.m.remove(4, 5)
obj.m.remove(*[4, 5]) # 清空
obj.m.clear() # 更新
obj.m.set([1, 2, 3]) # 添加
obj = models.Book.objects.get(id=1)
obj.author_set.add(1)
obj.author_set.add(1, 2, 3, 4)

Django ORM 一对多 和 多对多的更多相关文章

  1. djanjo ORM 一对多、多对多

    一.表操作之一对多 定义表结构:定义了UserType.两张表UserInfo,如下: from django.db import models class UserType(models.Model ...

  2. Django ORM、一对一、一对多、多对多、详解

    上篇博客也提到这些知识点,可能大家还是不太清楚,这篇博客为大家详细讲解ORM中的几个知识点 1.1首先我们先看一个小案例: #_*_coding:utf-8_*_ from django.db imp ...

  3. django ORM模型表的一对多、多对多关系、万能双下划线查询

    一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...

  4. Django 二——models(admin、ORM),一对一、一对多、多对多操作,all、values、value_list的对比

    内容概要 1.关系对象映射ORM 2.admin的配置(选修) 3.all().values().value_list()的对比 4.数据库操作(一对一.一对多.多对多) 5.HttpResponse ...

  5. Django ORM 一对一,一对多,多对多, 添加,批量插入和查询

    模型类 class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_ ...

  6. Django 一对多,多对多关系解析

    [转]Django 一对多,多对多关系解析   Django 的 ORM 有多种关系:一对一,多对一,多对多. 各自定义的方式为 :        一对一: OneToOneField         ...

  7. django中的一对一、一对多、多对多及ForeignKey()

    参考文章: Django ORM.一对一.一对多.多对多.详解 刘江的博客——关系类型字段 问题: OneToOneField()与ForeignKey()的区别及其使用场景

  8. 数据库开发-Django ORM的多对多查询

    数据库开发-Django ORM的多对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...

  9. 数据库开发-Django ORM的一对多查询

    数据库开发-Django ORM的一对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...

随机推荐

  1. redis 进程使用root用户启动 -- 整改方案

    最近内部风险整改, 各种进程使用root身份进行启动不符合要求, 于是各路神仙各施其法,为的就是让 某进程不以root 启动: 先以 redis 为例: 原有进程如下: #超一流标准的执行文件位置及配 ...

  2. 『008』Zabbix

    『006』索引-Monitoring Zabbix [001]- 点我快速打开文章[001-Zabbix 服务安装] [002]- 点我快速打开文章[002-Zabbix 前端配置] 更新中

  3. vue.nextTick()方法的使用详解

    什么是Vue.nextTick()??   定义:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 所以就衍生出了这个获取更新后的DOM的Vue方法 ...

  4. pyplot中的一些函数

    from matplotlib import pyplot as plt plt.ylabel(‘Grade’) : y轴的名称 plt.xlabel(‘Grade’) : x轴的名称 plt.tit ...

  5. CF-1208 C.Magic Grid

    题目 大意:构造一个n行n列的矩阵,使得每一行,每一列的异或和都相等,n是4的倍数. 先看4*4的矩阵,我们很容易构造出符合要求的矩阵,比如 0    1    2    3 4    5    6  ...

  6. vue.js操作元素属性

    vue动态操作div的class 看代码: <!doctype html> <html lang="en"> <head> <meta c ...

  7. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) F. Tree Factory 构造题

    F. Tree Factory Bytelandian Tree Factory produces trees for all kinds of industrial applications. Yo ...

  8. PMP图表(必背)

  9. etcd+https部署

    关闭防火墙 关闭selinux 下载所需的包(cfssl,生成证书工具) mkdir /usr/local/src/etcd/ cd /usr/local/src/etcd/ wget https:/ ...

  10. 1+X证书Web前端开发HTML专项练习

    1 . HTML5 之前的 HTML 版本是? A.HTML 4.01 B.HTML 4 C.HTML 4.1 D.HTML 4.9 2 . HTML5 的正确 doctype 是? A.<!D ...