Django 外键、多对多插入数据方法
models.py
class UserInfo(models.Model):
username = models.CharField(max_length=64,db_column='username')
passwd = models.CharField(max_length=64,db_column='password')
register_date = models.DateTimeField(max_length=32,db_column='register_date')
last_login_date = models.DateTimeField(max_length=32,db_column='last_login_date',null=True) class Meta:
app_label = 'simple'
db_table = 'user_info' class ServerInfo(models.Model):
hostname = models.CharField(max_length=32,db_column='hostname')
port = models.IntegerField(max_length=32,db_column='port')
status = models.CharField(max_length=32,db_column='status') class Meta:
app_label = 'simple'
db_table = 'server_info' class Publisher(models.Model):
name = models.CharField(max_length=32)
address = models.CharField(max_length=32)
state = models.CharField(max_length=32)
nation = models.CharField(max_length=32)
website = models.URLField(max_length=32) class Author(models.Model):
first_name = models.CharField(max_length=32)
last_name = models.CharField(max_length=32)
email = models.EmailField() class Book(models.Model):
title = models.CharField(max_length=32,unique=True)
author = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
pubDate = models.CharField(max_length=32)
views.py
def addBook(request):
if request.method == 'POST':
print("进入addbook post")
print(request.POST)
name = request.POST['name']
author = request.POST.getlist('author')# 当获取多个数值的时候,使用getlist
publisher = request.POST['publisher']
p1 = Publisher.objects.get(id=publisher)#先在publisher表中查询出前端选中出版社对应的对象
date = request.POST['publisherDate']
b1 = Book(title=name,publisher=p1,pubDate=date)
b1.save()#普通插入的数据和外键插入的数据需要先save()
b1 = Book.objects.get(title=name)#查出书名对象,也就是获取要插入的多对多数据项
if len(author) == 1:
b1.author.add(author[0])#多对多使用add方法进行插入
b1.save()
return redirect("/displayBook/")
elif len(author) == 0:#当用户没有选中作者
return render(request,'addBook.html',{"status":"添加出版社失败,没有选择作者"})
else:#循环插入用户选中的多个作者
for person in author:
b1.author.add(person)#多对多使用add方法进行插入
b1.save()
return redirect("/displayBook/")
print("进入addbook get") #用户从库中获取页面可选的内容,get请求
bookList = Book.objects.all()
publisherList = Publisher.objects.all()
authorList = Author.objects.all()
print(bookList,publisherList,authorList)
return render(request, 'addBook.html',{'books':bookList,
'publishers':publisherList,
'authors':authorList})
前端页面:
{% block head-menu %}
<table border=1 style="margin-left:13%;margin-top: 3%;height: 30px;width: 1000px">
<tr >
<td>书名</td>
<td>作者</td>
<td>出版社</td>
<td>出版日期</td>
</tr>
{% for book in books %}
{% if forloop.counter|divisibleby:"2" %}
<tr style="background-color: skyblue;">
<td>{{ book.title }}</td>
<td>{% for authorObj in book.author.select_related %} {{ authorObj.first_name }} {{ authorObj.last_name }} {% endfor %}</td>
<td>{{ book.publisher.name }}</td>
<td>{{ book.pubDate }}</td>
</tr>
</tr>
</tr>
{% else %}
<tr style="background-color: salmon;">
<td>{{ book.title }}</td>
<td>{% for authorObj in book.author.select_related %} {{ authorObj.first_name }} {{ authorObj.last_name }} {% endfor %}</td>
<td>{{ book.publisher.name }}</td>
<td>{{ book.pubDate }}</td>
</tr>
{% endif %}
{% endfor %}
</table>
<a href="/backend/"><button type="button" class="btn btn-primary btn-sm" style="margin-left: 43%;margin-top: 10%">返回</button></a>
{% endblock %}
Django 外键、多对多插入数据方法的更多相关文章
- django model 插入数据方法
需要插入的数据表结构如下: class UserInfo(models.Model): user_id =models.AutoField(primary_key=True) user_name=mo ...
- day42——外键的限制和解决方法、外键的三种约束模式、修改表(单表查询)
day42 外键的限制和解决方法 可以添加外键关联的那个字段可以是 被唯一(unique)约束的字段 或者 主键 限制:+ 由于外键的使用,致使多个表之间产生了联系,当我们对这些表进行更新或删除操作的 ...
- SQLServer 自增主键创建, 指定自增主键列值插入数据,插入主键
http://blog.csdn.net/zh2qiang/article/details/5323981 SQLServer 中含自增主键的表,通常不能直接指定ID值插入,可以采用以下方法插入. 1 ...
- Homework 1_SQL Server中由于外键约束而删除数据失败
SQL Server中由于外键约束而删除数据失败 原因分析:外键约束问题.在配置文件中配置了一对一的关系,外键也是唯一的.数据库中数据有严格的依赖关系. 而在业务逻辑中,在往数据库里删除数据之前,却忘 ...
- C# 批量插入数据方法
批量插入数据方法 void InsertTwo(List<CourseArrangeInfo> dtF) { Stopwatch watch = new Stopwatch(); watc ...
- sql实现同时向主表和子表插入数据方法
使用sql语句实现同时向主表和子表插入数据方法: Oracle: -- oracle创建sequence create sequence SEQ_test minvalue 1 maxvalue 99 ...
- 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法
072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...
- Django QuerySet 方法梳理 。model外键 多对多的保存
引用:https://feifeiyum.github.io/2017/03/28/python-django-queryset/ 说明 Models 层是 Django 框架中最强大的部分之一, 大 ...
- django中两张表有外键关系的相互查找方法,自定义json编码方法
两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列,该如何 ...
随机推荐
- Nginx使用默认配置启动异常处理
Ps1:错误问题:nginx: [error] OpenEvent("Global\ngx_reload_5988") failed (2: The system cannot f ...
- SpringBean的工作原理
在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean.简单地讲,bean 就是由 IOC 容器初始化.装配及管理的对象,除此之外,bean 就与 ...
- nrpe command
1. nrpe 连接问题: 报错:/usr/local/nagios/libexec/check_nrpe -H destip ; CHECK_NRPE: Error - Could no ...
- 【Qt开发】【Gstreamer开发】Qt error: glibconfig.h: No such file or directory #include
今天遇到一个问题如题 但是明明安装了 glib2.0和gtk,但是仍然找不到glibconfig.h,自己在/usr/include下找来也确实没有,然后只能在全盘搜啦 位置在: /usr/lib/x ...
- 【VS开发】千兆以太网的传输速度
千兆以太网主流标准 千兆以太网络技术早在上世纪90年代末就已成熟,其中,1995年国际标准化组织TIA/EIA颁布了1000Base-TX标准,该标准的目的是把双绞线用于千兆以太网中,其目的是在6类非 ...
- 最新 鹏博士java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.鹏博士等10家互联网公司的校招Offer,因为某些自身原因最终选择了鹏博士.6.7月主要是做系统复习.项目复盘.LeetCo ...
- vim中文帮助手册的安装
1. 下载: 下载页面:http://vimcdoc.sourceforge.net/ 选择“Latest platform independent tarball, including an Lin ...
- 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...
- (七)RequestMapping 和 Controller方法
文章目录 @[toc] RequestMapping功能 controller 方法返回值 RequestMapping功能 url映射 在定义 Controller 的,我们在方法上面,使用 @Re ...
- 19牛客暑期多校 round2 H 01矩阵内第二大矩形
题目传送门//res tp nowcoder 目的 给定n*m 01矩阵,求矩阵内第二大矩形 分析 O(nm)预处理01矩阵为n个直方图,问题转换为求n个直方图中的第二大矩形.单调栈计算,同时维护前二 ...