【笔记】Django的ORM之多对多表的增和删

Django ORM 多对多 

一 昨日补充:外键关联

外键在ORM中的关联方式:
与数据表相关的类都放到models.py文件中

class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, null=False, unique=True)
# 创建该数据表中的外键,如果要关联的类在该类的上面,可以用to=类名,否则加上引号
publisher = models.ForeignKey(to="Publisher")

ORM自动为该表创建名为'publisher_id'的字段

二 多对多表的创建

所对应的类:

class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, null=False, unique=True)
# 该字段是实现作者表与书表多对多的关键,ORM自动创建第三张关联表。
book = models.ManyToManyField(to="Book")

ORM自动创建第三张关联表,并且命名为'author_book',表中除自己的id外还有author_id和book_id

三 表内容的添加

难点:

  1. 考虑到多对多的关系,添加作者姓名的同时还要添加相关著作。
  2. 通过书的表取出相关数据放到多选下拉框中以供筛选。
    视图层:
<form action="/add_author/" method="post">
<p>
作者姓名:<input type="text" name="author_name">
</p> <p>
作品:
<selectmultiplename="books">
{% for book in book_list %}
<optionvalue="{{ book.id }}">{{ book.title }}</option>
{% endfor %}
</select>
</p> <p>
<input type="submit" value="提交">
</p> </form>
def add_author(request):
err_msg = ""
all_books = models.Book.objects.all()
if request.method == 'POST':
new_name = request.POST.get('author_name')
# 当获得的数据为多个时,使用getlist函数
books_id = request.POST.getlist("books")
if new_name and books_id:
new_author_obj = models.Author.objects.create(name=new_name)
# 给新添加的作者对象连接上相关的书籍对象
new_author_obj.book.set(books_id)
return redirect('/author_list/')
else:
err_msg = "作者姓名或著作不能为空!"
return render(request, 'add_author.html', {"error": err_msg, "book_list": all_books})

四 表的修改

难点:
与添加基本相同,多了在视图层给出所要修改数据行的信息部分。
视图层:

<form action="/edit_author/" method="post">
<input type="text" name="author_id" value="{{ author.id }}" style="display: none">
<p>
作者姓名:<input type="text" name="author_name" value="{{ author.name }}">
</p> <p>
作品:
<select multiple name="books">
{% for book in book_list %}
{# 如果当前这本书 在 当前作者关联的所有书 里面 #}
{% if book in author.book.all %}
<option selected value="{{ book.id }}">{{ book.title }}</option>
{% else %}
<option value="{{ book.id }}">{{ book.title }}</option>{% endif %}
{% endfor %}
</select>
</p> <p>
<input type="submit" value="提交">
</p> </form>

逻辑层:

def edit_author(request):
err_msg = ""
if request.method == "POST":
edit_id = request.POST.get("edit_id")
new_name = request.POST.get("author_name")
new_books = request.POST.getlist("books")
if new_name and new_books:
edit_author_obj = models.Author.objects.get(id=edit_id)
edit_author_obj.name = new_name
edit_author_obj.book.set(new_books)
edit_author_obj.save()
return redirect('/author_list/')
else:
err_msg = "作者姓名或著作不能为空!" edit_id = request.GET.get("id")
edit_author_obj = models.Author.objects.get(id=edit_id)
all_books = models.Book.objects.all()
return render(request, "edit_author.html", {"edit_author": edit_author_obj, "book_list": all_books, "error": err_msg})

最新文章

  1. Javascript初学篇章_7(DOM)
  2. jQuery弹出窗口浏览图片
  3. java中的tuple实现
  4. 错误C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型
  5. mysql 主主复制的配置流程
  6. Android ScrollView+ViewPager+PullToRefreshListView
  7. 应用Oracle(解锁内置用户)
  8. Flex移动应用程序开发的技巧和窍门(二)
  9. Celery(四)定时任务
  10. 潭州课堂25班:Ph201805201 tornado 项目 第六课 用户和图片分享的集成(课堂笔记)
  11. MyBatis笔记----MyBatis数据库表格数据修改更新的两种方法:XML与注解
  12. 【转】 诡异的ORA-02289: sequence does not exist
  13. 使用python实现深度神经网络 3(转)
  14. CentOS7:搭建配置SVN服务器
  15. linux及安全第五周总结
  16. Spring学习笔记--代理
  17. 关于 RabbitMQ 的 Dead-Letters-Queue “死信队列”
  18. &#39;telnet&#39;不是内部或外部命令,怎么办?
  19. msdn 中MethodBase.Invoke 方法 介绍中的坑
  20. 【笔记】JS数据类型总结

热门文章

  1. 【转】Android下面打印进程函数调用堆栈(dump backtrace)的方法
  2. Spring装配各种类型bean
  3. struct-config.xml配置文件的解析
  4. filter(函数,可以迭代的对象)
  5. [patl2-014]列车调度
  6. Apollo——安装
  7. 3、PACBIO下机数据如何看
  8. 后台传Map到ftl
  9. scala中的注解
  10. 《Linux内核设计与实现》读书笔记(九)- 内核同步介绍