django图书管理系统(作者模块) day05

内容回顾

django处理请求的流程

  • 浏览器的地址栏输入地址,发送get请求
  • wsgi接收到请求
  • 根据url的路径找到对应的函数
  • 执行函数,返回响应。响应返回给wsgi,wsgi按照HTTP响应格式返回给浏览器

发请求的途径

  • 地址栏中输入地址- ->get
  • a标签 --->get
  • form表单 ---> get/post

ORM

  • 对象关系

    类 --->  数据表
    对象 --->  数据行(记录)
    属性 --->  字段
    

django使用MySQL数据库的流程:

  • 创建一个MySQL数据库的流程

  • 配置

    ENGINE  mysql
    NAME	数据库名称
    HOST	IP
    PORT	3306
    USER	用户名
    PASSWORD	密码
    
  • 告诉django使用pymysql连接数据库

    • 在与settings统计的init文件夹中写:

      import pymysql
      pymysql.install_as_MySQdb()
      
  • 写表 在app下的models.py中写类

    class Book(models.Model):
        name = models.CharField(max_length=32)
        pub = modols.ForeignKey('Publisher',on_delete=models.CASECADE)
    
  • 执行数据库迁移命令

    python manage.py makemigrations #记录models.py的变更记录

    python manage.py migrate #将变更记录同步到数据库中

增删改查

  • book_obj = Book.object.create(name='xxx',pub=出版社对象)
    book_obj = Book.object.create(name='xxx',pub_id=出版社对象的id)
    book_obj = Book(name='xxx',pub=出版社对象)
    book_obj.save
    
  • #查询所有的对象
    Book.objects.all()  #--->queryset 对象列表
    #查询一个对象
    book_obj = Book.objects.get(name='xxx')  #---->对象(有且唯一)  查不到或者多个就报错
    #查询满足条件的所有的对象
    Book.objects.filter(name='xxx') #--->queryset 对象列表
    
    book_obj.id         book_obj.pk
    book_obj.name
    book_obj.pub #--->出版社对象
    book_obj.pub.pk
    book_obj.pub_id
    
  • 删除

    book_obj.delete()
    Book.objects.filter(pk=1).delete()
    
  • book_obj.name = 'xxx'
    book_obj.pub = 出版社对象
    book_obj.pub_id = 出版社的id
    book_obj.save()  #-->保存到数据库中
    

模板的语法

render(request,'模板的文件名',{"xxx":"vi"})
{{ xxx }}

for循环
{% for i in list %}
	{{ forloop.counter}}
	{{ i }}
{% endfor %}

if判断
{% if 条件1 %}
	xxx
{% elif 条件2%}
    xxx
{% else %}
	xxx
{% endif %}

函数

  • request
  • request.method ---> 请求方式 GET POST
  • request.GET ---> url上的参数 ?name=xxx&age=18 {} [] .get
  • request.POST ---> form表单提交POST请求的数据

响应

  • HTTPResponse('字符串') ----> 字符串
  • render(request,'模板的文件名',{}) ---->返回一个完整的页面
  • redirect('重定向的地址') ---->本质Location:地址

今日内容

作者的管理

  • 设计表结构

    出版社		书籍		作者
    

    django图书管理系统(作者模块) day05

  • 作者展示

    def author_list(request):
        # 获取到所有的作者信息
        all_authors = models.Author.objects.all().order_by('pk')
        # for author in all_authors:
        #     print(author)
        #     print(author.name)
        #     print(author.id)
        #     print(author.books)          # 管理对象
        #     print(author.books.all())    # 作者关联的所有书籍对象
        #     print("*" * 30)
    
        return render(request, 'author_list.html', {'all_authors': all_authors})
    
    
    <table border="1">
        <thead>
        <tr>
            <th>序号</th>
            <th>id</th>
            <th>名字</th>
            <th>代表作</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
    
        {% for author in all_authors %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ author.pk }}</td>
                <td>{{ author.name }}</td>
                <td>
                    {% for book in  author.books.all %}
                        {% if forloop.last %}
                            《{{ book.title }}》
                        {% else %}
                            《{{ book.title }}》|
                        {% endif %}
    
                    {% endfor %}
                </td>
                <td>
                    <a href="/del_author/?pk={{ author.pk }}">删除</a>
                    <a href="/edit_author/?pk={{ author.pk }}">编辑</a>
                </td>
    
            </tr>
        {% endfor %}
        </tbody>
    </table>
    
    # 展示作者
        url(r'^author_list/', views.author_list),
    
  • 作者增加

    # 增加作者
    def add_author(request):
        if request.method == 'POST':
            # 获取提交的数据
            new_name = request.POST.get('name')
            book_ids = request.POST.getlist('books')
            # print(request.POST)
            # print(new_name)
            # print(book_ids)
            # 数据插入到数据库中
            # 创建一个新的作者
            author_obj = models.Author.objects.create(name=new_name)
            # 作者与书籍做多对多的关联
            author_obj.books.set(book_ids)
            return redirect('/author_list/')
    
        # 获取所有的书籍的信息
        all_books = models.Book.objects.all()
        return render(request, 'add_author.html', {"books": all_books})
    
  • 删除作者

    # 删除作者
    def del_author(request):
        # 从URL上获取要删除对象的ID
        del_id = request.GET.get('pk')
        # 删除对象
        models.Author.objects.get(pk=del_id).delete()
        # models.Author.objects.filter(pk=del_id).delete()
        # 1. 删除了查询的对象
        # 2. 删除了对象的多对多的记录
    
        return redirect('/author_list/')
    
    
  • 编辑作者

    # 编辑作者
    def edit_author(request):
        # 获取要编辑的作者的ID
        pk = request.GET.get('pk')
        # 获取编辑的对象
        author_obj = models.Author.objects.get(pk=pk)
    
        if request.method == 'POST':
            # 获取提交的数据
            name = request.POST.get('name')
            book_ids = request.POST.getlist('books')
    
            # 修改数据
            # 修改了作者名字
            author_obj.name = name
            author_obj.save()
            # 修改作者和书籍多对多的关系
            author_obj.books.set(book_ids)  # 所有的记录都重新设置   不需要save()
    
            return redirect('/author_list/')
    
        # 查询所有的书籍
        books = models.Book.objects.all()
    
        return render(request, 'edit_author.html', {'author_obj': author_obj, 'books': books})
    

django设置多对多的方法

  • django帮我们生成第三张表

    class Author(models.Model):
        name = models.CharField(max_length=32, unique=True)  # 作者的名字
        books = models.ManyToManyField('Book')  # 表示作者和书籍 多对多的关系
    
  • 自己创建第三张表

    class Author_book(models.Model):
        author = models.ForeignKey('Author')
        book = models.ForeignKey('Book')
        date = models.DateTimeField()
    
  • 自建的表和django中ManyToManyField联合使用

    class Author(models.Model):
    	 name = models.CharField(max_length=32, unique=True)  # 作者的名字
    	books = models.ManyToManyField('Book', through='Author_book',through_fields = ['author','tuijian'])  # 表示作者和书籍 多对多的关系;不在Author表中生产字段,生产第三张表
        
    class Author_book(models.Model):
        author = models.ForeignKey(Author,related_name='a',on_delete=models.CASCADE)
        book = models.ForeignKey(Book,on_delete=models.CASCADE)
        tuijian = models.ForeignKey(Author,related_name='b',on_delete=models.CASCADE)
        date = models.DateTimeField()
    
上一篇:mybatis中的动态SQL


下一篇:MyBatis学习笔记-动态SQL