【笔记】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})

原文地址:https://www.cnblogs.com/banshaohuan/p/9265467.html