背景
有两张表 1. 作者 2.书籍
关系:一个作者可以写多本书、一本书也可以多个作者
创建
思路:类似于给作者表做一个外链表 inner join
'''作者表'''
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16,null=False,unique=True) # 不为空, 唯一
# 作者关联书籍表
# 设置当前表与指定表的关联,ORM自动生成一张表对应,格式 app_当前表_关联表
book = models.ManyToManyField(to='Book')
'''会生成一张app+author_book的表'''
'''
查询某个作者写了哪些书的时候
通过作者.book.all()可以展示出该作者所有的书籍【对象】!
再通过书籍对象.name 打印书籍名
'''
html
{% for bk in p.book.all %}
{# 这里判断如果最后一本书,就不需要加分隔符#}
{% if forloop.last %}
{{ bk.name }}
{% else %}
{{ bk.name }} |
{% endif %}
{% endfor %}
新增\修改
新增的时候如何解决,外链的内容(新增作者,写了n本书)
html 新增一个作者,写的多本书
多选下拉框提交,选择几本书一起提交
multiple 为可以复选的下拉表
<select multiple name="books" id="books" >
{% for book in books %}
<option value="{{ book.id }}">{{ book.name }}</option>
{% endfor %}
</select>
views中,重点
def add_author(request):
new_name = request.POST.get('name')
# 获取作者多本书籍
'''【多选框checkbox和多选的select!!!用 getlist 返回【列表】】'''
books = request.POST.getlist('books')
#创建作者
new_obj = models.Author.objects.create(name=new_name) # 获取到对象
# 把新作者和书籍建立关系 book 是作者对象里边的,多表连接
'''【用set方法把多本书籍列表导入django自动完成加表工作】'''
new_obj.book.set(books)