ORM 多表作业

项目路由控制器 app01.urls.py

from app01.views import *

urlpatterns = [
    path("addbook/",book_add),
    path("sqlinsert/",sql_insert),
    path("search/",book_search),
    re_path("edit/(\d+)/$",book_edit),
    re_path("delete/(\d+)/$",book_delete)
]

项目视图控制器 app01.view.py

from app01 import models

def book_add(request):
    if request.method=="POST":
        #如果递交方式为post,获取新增数据的内容 有些内容是id
        bk_name = request.POST.get("bk_name")
        bk_price = request.POST.get("bk_price")
        bk_pub_date = request.POST.get("bk_pub_date")
        publish = request.POST.get("publish_id")
        # getlist 是因为作者是多选项,我们如果用get只能获取一个值,但是应该获取的是一个列表
        author = request.POST.getlist("author_lists")

        #把数据都写入数据库
        bk = models.Book.objects.create(title=bk_name,price=bk_price,pub_date=bk_pub_date,publish_id=publish)
        bk.author.add(*author)
        return redirect("/my/addbook/")
        # return HttpResponse(bk_pub_date)
    pubs = models.Publish.objects.all()
    auths = models.Author.objects.all()
    return render(request,"book_add.html",{"pubs":pubs,"auths":auths})


def sql_insert(request):
    # 添加出版社数据
    pub_lists = ["浙江出版社","山东出版社","济南出版社","南京出版社","北京出版社","天津出版社","深圳出版社"]
    pub=[models.Publish.objects.create(name=i) for i in pub_lists]
    # 添加作者详情表
    auth_detail = models.Author_detail.objects.create(city="济南",add="济南区")
    auth_detail = models.Author_detail.objects.create(city="山东",add="山东区")
    auth_detail = models.Author_detail.objects.create(city="浙江",add="浙江区")
    auth_detail = models.Author_detail.objects.create(city="南京",add="南京区")
    auth_detail = models.Author_detail.objects.create(city="深圳",add="深圳区")
    auth_detail = models.Author_detail.objects.create(city="天津",add="天津区")
    auth_detail = models.Author_detail.objects.create(city="北京", add="北京区")
    #添加作者详情,先根据城市获取作者详情表的id,再添加到作者表中
    #让作者表中的auth_detail和详情ID产生关联
    city_lists = ["浙江 ","山东","济南","南京","天津","深圳","北京"]
    auth_name = ["alex","blex","clex","dlex","elex","flex","glex"]
    for idx,city in enumerate(city_lists):
        au_detail = models.Author_detail.objects.get(city=city)
        auth1 = models.Author.objects.create(name=auth_name[idx],age=19+idx,author_detail=au_detail)


    return HttpResponse("数据数据初始化添加完毕")

def book_search(request):
    bks = models.Book.objects.all()

    return render(request,"book_search.html",{"bks":bks})


def book_edit(request,idx):
    bk = models.Book.objects.get(pk = idx)
    publishs = models.Publish.objects.all()
    auths = models.Author.objects.all()
    if request.method=="POST":
        bk_name = request.POST.get("bk_name")
        bk_price = request.POST.get("bk_price")
        bk_pub_date = request.POST.get("bk_pub_date")
        publish = request.POST.get("publish")
        auths = request.POST.getlist("author_lists")
        models.Book.objects.filter(pk=idx).update(title=bk_name,price = bk_price,pub_date = bk_pub_date,publish_id = publish)
        # bk.author.clear()
        # bk.author.add(*auths)
        # set等于上面2步,先清除对象的关闭,再新建新的关系表
        bk.author.set(auths)


        return redirect("/my/search/")
        # author = bk.author.all()
        #
        # bk.update(title = bk_name)
    # print(bk.pub_date)
    return render(request,"book_edit.html",locals())


def book_delete(request,idx):

    bk = models.Book.objects.filter(pk=idx)
    bk.delete()

    return redirect("/my/search")

项目ORM模块 appo1.models.py

from django.db import models


# Create your models here.
class Book(models.Model):  # 意见
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    pub_date = models.DateField()
    publish = models.ForeignKey(to="Publish", to_field="pid", on_delete=models.CASCADE)
    author = models.ManyToManyField(to="Author")

    def __str__(self):
        return self.title


class Publish(models.Model):
    pid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)


class Author(models.Model):
    aid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to="Author_detail", to_field="aid", on_delete=models.CASCADE)


class Author_detail(models.Model):  # 已建
    aid = models.AutoField(primary_key=True)
    add = models.CharField(max_length=32)
    city = models.CharField(max_length=32)

网页book_add.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Book_add</title>
    <link rel="stylesheet" href="/static/css/bootstrap.css">
</head>
<body>
<h2 class="text-center">书籍添加</h2>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-4 col-lg-4 col-sm-3  col-md-offset-4 col-lg-offset-4 col-sm-offset-5">
            <a href="/my/search" class="btn btn-success">返回查询页面</a>
            <form action="" method="post">
                {% csrf_token %}
                <div class="form-group">
                    <label for="add_book">书名</label>
                    <input type="text" name="bk_name" id="add_book" class="form-control">
                </div>
                <div class="form-group">
                    <label for="price">价格</label>
                    <input type="text" name="bk_price" id="price" class="form-control">
                </div>
                <div class="form-group">
                    <label for="pub_date">出版日期</label>
                    <input type="date" name="bk_pub_date" id="pub_date" class="form-control">
                </div>
                <div class="form-group">
                    <label for="pub_date">出版社</label>
                    <select name="publish_id" id="" class="form-control">
                        {% for pub in pubs %}
                            <option value="{{ pub.pk }}">{{ pub.name }}</option>
                        {% endfor %}
                    </select>
                    
                </div>
                <div class="form-group">
                    <label for="author">作者</label>
                    <select name="author_lists" id="" class="form-control" multiple>
                        {% for auth in auths %}
                            <option value="{{ auth.pk }}">{{ auth.name }}</option>
                        {% endfor %}
                    </select>
                </div>

                <div class="form-group pull-right">
                    <input type="submit" class="btn btn-success" value="提交">
                </div>

            </form>
        </div>
    </div>

</div>

</body>
</html>

网页book_edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Book_add</title>
    <link rel="stylesheet" href="/static/css/bootstrap.css">
</head>
<body>
<h2 class="text-center">书籍添加</h2>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-4 col-lg-4 col-sm-3  col-md-offset-4 col-lg-offset-4 col-sm-offset-5">
            <a href="/my/search" class="btn btn-success">返回查询页面</a>
            <form action="" method="post">
                {% csrf_token %}
                <div class="form-group">
                    <label for="add_book">书名</label>
                    <input type="text" name="bk_name" id="add_book" class="form-control">
                </div>
                <div class="form-group">
                    <label for="price">价格</label>
                    <input type="text" name="bk_price" id="price" class="form-control">
                </div>
                <div class="form-group">
                    <label for="pub_date">出版日期</label>
                    <input type="date" name="bk_pub_date" id="pub_date" class="form-control">
                </div>
                <div class="form-group">
                    <label for="pub_date">出版社</label>
                    <select name="publish_id" id="" class="form-control">
                        {% for pub in pubs %}
                            <option value="{{ pub.pk }}">{{ pub.name }}</option>
                        {% endfor %}
                    </select>
                    
                </div>
                <div class="form-group">
                    <label for="author">作者</label>
                    <select name="author_lists" id="" class="form-control" multiple>
                        {% for auth in auths %}
                            <option value="{{ auth.pk }}">{{ auth.name }}</option>
                        {% endfor %}
                    </select>
                </div>

                <div class="form-group pull-right">
                    <input type="submit" class="btn btn-success" value="提交">
                </div>

            </form>
        </div>
    </div>

</div>

</body>
</html>

网页book_search.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Book_serach</title>
    <link rel="stylesheet" href="/static/css/bootstrap.css">
</head>
<body>
<h2 class="text-center">书籍查询</h2>
<div class="container-fluid">
    <div class="row">

        <div class="col-lg-6 col-md-5 col-sm-4 col-lg-offset-3 col-md-offset-3">
            <a href="/my/addbook/" class="btn btn-primary">新增书籍</a>
            <table class="table table-bordered table-striped">
            <thead>
                <tr>
                    <th  class="text-center">编码</th>
                    <th  class="text-center">书籍名称</th>
                    <th  class="text-center">出版日期</th>
                    <th  class="text-center">价格</th>
                    <th  class="text-center">出版社</th>
                    <th  class="text-center">作者</th>
                    <th  class="text-center">编辑操作</th>
                    <th  class="text-center">删除操作</th>
                </tr>
                </thead>
            <tbody>
{#bks是Book对象,里面的价格 书本名字可以直接通过属性获得,但是他的出版社需要通过正向查询的表名+字段获取  也就是bk.publiish.name#}
                    {% for bk in bks %}
                        <tr>
                        <td>{{ forloop.counter }}</td>
                        <td>{{bk.title}}</td>
                        <td>{{bk.pub_date|date:"Y-m-d"}}</td>
                        <td>{{bk.price}}</td>
                        <td>{{bk.publish.name}}</td>
                        <td>
{#先通过单个bk对象获取到author字段的所有数据  也就是bk.author.all  这里all不用加大括号 因为作者和书籍是多对多关系,所以bk.author.all 获取的不是一个值,而是多个值组成的queryset,还需要再次遍历提取作者表中的name字段#}
                            {% for each_bk_author_name in bk.author.all %}
{#这里实现的效果是作者和作者之间用逗号隔开,但是最后一个作者不需要加逗号,用forloop.last判断是否是最后一个循环,如果是不加逗号,否则模板语法后面加个逗号#}
                                {% if forloop.last %}
                                <span>{{each_bk_author_name.name}}</span>
                                    {% else %}
                                 <span>{{each_bk_author_name.name}},</span>
                                {% endif %}
                            {% endfor %}
                        </td>
                        <td><a href="/my/edit/{{ bk.pk }}/" class="btn btn-info">编辑操作</a></td>
                        <td><a href="/my/delete/{{ bk.pk }}/" class="btn btn-danger">删除操作</a></td>
                        </tr>
                    {% endfor %}
                </tbody>

            </table>
        </div>
    </div>
</div>
</body>
</html>
posted @ 2021-09-05 19:55  零哭谷  阅读(35)  评论(0编辑  收藏  举报