Loading

orm关系

多对多

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 %}

参考这篇文章
https://www.cnblogs.com/flhw/p/14149411.html

posted @ 2020-12-17 10:49  封灵寒武  阅读(81)  评论(0编辑  收藏  举报