zoukankan      html  css  js  c++  java
  • 【笔记】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})

  • 相关阅读:
    linux初学者-ftp篇(一)
    随机密码生成
    倒计时问题java
    百钱买鸡
    去7JAVA
    贪吃蛇Controller Java实现(二)
    贪吃蛇Global Java实现(二)
    贪吃蛇GamePanel Java实现(二)
    贪吃蛇Listener Java实现(二)
    贪吃蛇snake Java实现(二)
  • 原文地址:https://www.cnblogs.com/banshaohuan/p/9265467.html
Copyright © 2011-2022 走看看