Django之modles 多对多创建第三张表
一.第一种:纯自动创建第三张表
纯自动
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
authors = models.ManyToManyField(to='Author') class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
优点:可以利用双下划线和对象点语法 正向 反向
缺点:第三张表的字段 被限定死了 拓展性极差
二.第二种纯手动创建第三张表
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2) class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() # 纯手动创建第三张表
class Book2Author(models.Model):
Book = models.ForeignKey(to='Book')
Author = models.ForeignKey(to='Author')
# 基于第一种没有办法拓展我们第三张表中的字段 纯自动固定只有我们的Book和Author 拓展性极差
info = models.CharField(max_length=64)
test 测试代码
import os
import sys if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_22.settings")
import django
django.setup() from app01 import models # res = models.Book.objects.filter(pk=1).values('author__name')
# print(res) # 基于双下划线反向表名也不行了 book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.author__set.all()) # AttributeError: 'NoneType' object has no attribute 'author__set # 基于对象单向表名小写_set >>>反向结果维多必须加_set
# 这种方法也不行 查不了 所学知识没办法查啊
优点:第三张表可以添加其他字段拓展性高
缺点:没办法进行正向 反向 __双下划线 和 对象点语法查询 正向字段没有字段 所以没有办法利用ORM 查询
三.第三种半自动 半手动
全是优点:以后开发基本就是用第三种
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book', 'author')) class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
buthor = models.ForeignKey(to='Author')
# 基于第一种没有办法拓展我们第三张表中的字段 纯自动固定只有我们的Book和Author 拓展性极差
info = models.CharField(max_length=64)
图形理解


注意点:

test
res = models.Book.objects.filter(pk=1).values('authors__name')
print(res) # <QuerySet [{'authors__name': 'koko'}]>
# 有时数据库的原因会将数据卡主 需要手动更新 不然查不到数据
正向 反向 查
# 正向查
# book_obj = models.Book.objects.filter(pk=1).first()
# print(book_obj.authors.all()) # <QuerySet [<Author: Author object>]>
# 正向按字段 结果为多的.all() 即可 # 反向查 作者为yyy的书籍名称
res = models.Author.objects.filter(name='yyy').values('book__title')
print(res) # <QuerySet [{'book__title': '海贼王'}]>
Django之modles 多对多创建第三张表的更多相关文章
- Django框架(十一)-- 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表、mvc和mtv模式
一.inclusion_tag 1.作用 用于生成HTML片段,是数据由参数传入而变成动态 2.使用 # 1.app下新建一个模块,templatetags # 2.创建一个py文件(mytag.py ...
- Django框架(十二)—— 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表
目录 补充:inclusion_tag.defer.only.choice.事务.创建多对多的第三张表 一.inclusion_tag 1.作用 2.使用 二.defer与only 1.定义 2.使用 ...
- Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)
1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...
- django 多对多自定义第三张表时的注意事项
杂交(自定义第三张表+ManyToManyField) # modles.py class Boy(models.Model): name = models.CharField(max_length= ...
- $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)
自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...
- django orm 多对多自定义第三张表
# -*- coding: utf-8 -*-# Generated by Django 1.11.11 on 2018-09-02 08:07from __future__ import unico ...
- (day57)九、多对多创建的三种方式、Forms组件
目录 一.多对多三种创建方式 (一)全自动 (二)纯手撸(基本不用) (三)半自动(推荐使用) 二.forms组件 (一)校验数据 (1)常用内置字段及参数 (2)内置的校验器 (3)HOOK方法 ( ...
- 多对多第三张表的创建方式 和 forms组件的使用
目录 一.多对多第三张表的创建 1. 全自动方式 (1)实现代码 (2)优点和不足 2. 纯手撸方式(了解) (1)实现代码 (2)优点和不足 3. 半自动方式(推荐使用) (1)实现代码 (2)优点 ...
- Django:常用字段、手动自动第三张表单、元信息
一.常用字段和非常用字段 二.手动,自动创建第三张表 三.元信息 四.defer和only 一.常用字段和非常用字段 -常用字段 AutoField int自增列,必须填入参数 primary_key ...
随机推荐
- centos-系统删除多余网卡的方法
一.删除系统中中多余的ifcfg-eth0.bak Centos系统更改网卡或网卡MAC地址后会出现个eth0.bak配置备份文件解决方法:/etc/sysconfig/networking/devi ...
- CentOS 6.7与CentOS 7.3内存查看命令free、top的差异对比
https://www.centos.bz/2017/08/centos-6-7-centos-7-3-free-top/
- metrics+spring+influxdb
https://www.cnblogs.com/lixyu/p/9337055.html
- K8S 笔记,请坚持
service 通过 selector 来选择指定 label 的 pod. 如何访问 service 呢?集群内部访问,使用 cluster ip:集群外部访问,使用 NodePort. clust ...
- Python基本语法_文件操作_读写函数详解
目录 目录 软件环境 file文件对象 open文件操作 读文件 read读取所有文件内容 readline获取一行内容 readlines读取所有文件内容 readreadlinereadlines ...
- 在VSCode中开启ESLint风格审查
最近一直在学习开发一个VUE项目,几乎没有前端基础摸爬滚打,就一边摸索HTML,JS,CSS一边模仿着已有代码开发,也还算能学到东西. VSCode确实还不错,很轻量.在刚开始学写vue的时候,后台总 ...
- 基于Python对象引用、可变性和垃圾回收详解
基于Python对象引用.可变性和垃圾回收详解 下面小编就为大家带来一篇基于Python对象引用.可变性和垃圾回收详解.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. 变量不是盒子 在示例所示 ...
- windows 的cmd设置代理的问题
今天给公司一同事用cmd来安装gulp(npm install -g gulp), 死活安装不上,一直报一大堆的错误:经仔细查阅是代理的问题,故总结如下: 若公司的电脑是通过设置代理来访问外网,则需要 ...
- python 爬虫入门1 爬取代理服务器网址
刚学,只会一点正则,还只能爬1页..以后还会加入测试 #coding:utf-8 import urllib import urllib2 import re #抓取代理服务器地址 Key = 1 u ...
- DedeCMS调取其他织梦CMS站点数据库数据方法
第1步:打开网站include\taglib文件夹中找到sql.lib.php文件,并直接复制一些此文件出来,并把复制出来的这个文件重命名为mysql.lib.php.注:mysql.lib.php, ...