多对多
models
# 出版社表
class Publisher(models.Model):
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, unique=True)
addr = models.CharField(max_length=32)
def __str__(self):
return self.name
#书籍表
class Book(models.Model):
title = models.CharField(max_length=32, unique=True)
pub = models.ForeignKey('Publisher', on_delete=models.CASCADE) # 多对一指的是,多个书籍可以对应一个出版社
#作者表
class Author(models.Model):
name = models.CharField(max_length=32)
books = models.ManyToManyField('Book') # 多对多的是,多个作者对应多个书籍
views
多对多
查:
all_authors = models.Author.objects.all()
for i in all_authors:
print(i,type(i))
print(i.pk,type(i.pk))
print(i.name,type(i.name))
print(i.books,type(i.books)) #多对多的关系管理对象
print(i.books.all(),type(i.books.all())) #这里的books就是所谓的关系管理对象可以使用all(),filter()等orm语法进去取值
对于返回值:
Author object <class 'app01.models.Author'>
1 <class 'int'>
金庸 <class 'str'>
app01.Book.None <class 'django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager'>
<QuerySet [<Book: Book object>]> <class 'django.db.models.query.QuerySet'>
增:
if request.method == 'POST':
author_name = request.POST.get('author_name')
books = request.POST.getlist('books') #获取多个书籍多个数据
# 存入数据
author_obj = models.Author.objects.create(name=author_name) 先存作者名字
author_obj.books.set(books) #用返回值存多个书籍
templates
{% for author in all_authors %}
<tr>
<td>{{ author.pk }}</td> # 在Author表里直接取pk,name,但是books只是关系管理对象所以需要做循环以及进一步处理,
<td>{{ author.name }}</td>
<td>
{% for book in author.books.all %}
《{{ book.title }}》 # 在这里做循环后取书籍表的名字,在模板里.all不用加()
{% endfor %}
</td>
</tr>
{% endfor %}