Django 查询

最终效果

这里写图片描述
新增
这里写图片描述
修改
这里写图片描述

背景

三张表: 【作者】 【书籍】 【出版社】
因为作者与书籍存在多对多所以会多生成出一张关系表

三个数据库字段

from django.db import models

# 作者表
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age=models.IntegerField()

# 出版社表
class Publish(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

# 书籍表
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    price = models.DecimalField(max_digits=5,decimal_places=2) # 最大长度5,2位小数

    # 与 出版社建立1对多关系,外键在多的一方
    publish = models.ForeignKey(to='Publish',to_field='id',on_delete=models.CASCADE)
    # 与作者创建多对多关系
    authors = models.ManyToManyField(to='Author')

视图

from django.shortcuts import render,redirect
from app01 import models

# 新增书籍
def add_book(request):
    if request.method=='GET':
        publish_list = models.Publish.objects.order_by('id')
        author_list = models.Author.objects.order_by('id')
        return render(request,'add_book.html',{'publish_list':publish_list,"author_list":author_list})
    else:
        title = request.POST.get('title')
        price = request.POST.get('price')
        pub_date = request.POST.get('pub_date')
        publish_id = request.POST.get('publish_id')
        authors_id_list = request.POST.getlist('authors_id_list') # 多选才这么操作!!getlist

        book_obj = models.Book.objects.create(title=title,price=price,publishDate=pub_date,publish_id=publish_id)
        book_obj.authors.set(authors_id_list)

        return redirect('/')


# 书籍列表
def books(request):
    books_list = models.Book.objects.all()
    return render(request,'books.html',{'books_list':books_list})


# 修改书籍信息
def change_book(request,id):
    if request.method == 'GET':
        edit_obj = models.Book.objects.get(nid=id)
        publish_list = models.Publish.objects.order_by('id')
        author_list = models.Author.objects.order_by('id')
        return render(request,'editbook.html',{'edit_obj':edit_obj,'publish_list':publish_list,'author_list':author_list})
    else:
        edit_id = request.POST.get('id')
        title = request.POST.get('title')
        price = request.POST.get('price')
        pub_date = request.POST.get('pub_date')
        publish_id = request.POST.get('publish_id')
        authors_id_list = request.POST.getlist('authors_id_list')

        edit_obj = models.Book.objects.get(nid=edit_id)
        edit_obj.title = title
        edit_obj.price = price
        edit_obj.publishDate = pub_date
        edit_obj.publish_id = publish_id
        edit_obj.authors.set(authors_id_list)

        # 或者方法2:
        # models.Book.objects.get(nid=edit_id).update(title=title,price=price,....)
        edit_obj.save()
        return redirect('/')

# 删除书籍
def del_book(request,id):
    del_obj = models.Book.objects.get(nid=id)
    del_obj.delete()
    return redirect('/')

HTML 采用Bootstrap

新增书籍

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body>

<h3>添加书籍</h3>
<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3"></div>
        <form action="" method="post">
            <div class="form-group">                <!--form-group 表单之间加间隙-->
                <label for="">书名</label>
                <input type="text" name="title" class="form-control">       <!--form-control 表单样式-->
            </div>
            <div class="form-group">
                <label for="">价格</label>
                <input type="text" name="price" class="form-control">
            </div>
            <div class="form-group">
                <label for="">出版日期</label>
                <input type="date" name="pub_date" class="form-control">
            </div>
            <div class="form-group">
                <label for="">出版社</label>
                <select name="publish_id" id="" class="form-control">
                    {% for publish in publish_list %}
                        <option value="{{ publish.id }}">{{ publish.name }}</option>
                    {% endfor %}
                </select>
            </div>
            <div class="form-group">
                <label for="">作者</label>
                <select name="authors_id_list" id="" multiple class="form-control">
                    {% for author in author_list %}
                        <option value="{{ author.id }}">{{ author.name }}</option>
                    {% endfor %}


                </select>
            </div>
            <div>
                <input type="submit" class="btn btn-default">
            </div>
        </form>
    </div>
</div>


</body>
</html>

打印列表

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>书籍列表</title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body>
<h3>书籍列表</h3>

<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <table class="table table-bordered table-hover table-striped">
                <thead>
                    <tr>
                        <th>编号</th>
                        <th>书名</th>
                        <th>价格</th>
                        <th>出版社</th>
                        <th>出版日期</th>
                        <th>作者</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody>
                    {% for books in books_list %}
                    <tr>
                        <td>{{ forloop.counter }}</td>
                        <td>{{ books.title }}</td>
                        <td>{{ books.price }}</td>
                        <td>{{ books.publish.name }}</td>
                        <td>{{ books.publishDate|date:'Y-m-d'}}</td>
                        <td>
                            {% for author in books.authors.all %}
                                {% if forloop.last %}
                                    <span>{{ author.name }}</span>
                                {% else %}
                                    <span>{{ author.name }}</span>,
                                {% endif %}
                            {% endfor %}
                        </td>
                        <td>
                            <a href="books/{{ books.nid }}/change" class="btn btn-warning">编辑</a>
                            <a href="books/{{ books.nid }}/del" class="btn btn-danger">删除</a>
                        </td>
                    </tr>
                    {% endfor %}
                    
                </tbody>
            </table>
        </div>
    </div>
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <form action="/add_book/">
                <input type="submit" value="新增书籍" class="btn btn-block">
            </form>

        </div>
    </div>
</div>
</body>
</html>

修改书本

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
</head>
<body>

<h3>添加书籍</h3>
<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3"></div>
        <form action="" method="post">
            <div class="form-group">                <!--form-group 表单之间加间隙-->
                <label for="">书名</label>
                <input type="text" name="title" class="form-control" value="{{ edit_obj.title }}">       <!--form-control 表单样式-->
            </div>
            <div class="form-group">
                <label for="">价格</label>
                <input type="text" name="price" class="form-control" value="{{ edit_obj.price }}">
            </div>
            <div class="form-group">
                <label for="">出版日期</label>
                <input type="date" name="pub_date" class="form-control"  value="{{ edit_obj.publishDate|date:'Y-m-d'}}">
            </div>
            <div class="form-group">
                <label for="">出版社</label>
                <select name="publish_id" id="" class="form-control">
                    {% for publish in publish_list %}
                        {% if edit_obj.publish == publish %}
                            <option selected value="{{ publish.id }}">{{ publish.name }}</option> <!--默认选项加selected-->
                        {% else %}
                            <option value="{{ publish.id }}">{{ publish.name }}</option>
                        {% endif %}
                    {% endfor %}
                </select>
            </div>
            <div class="form-group">
                <label for="">作者</label>
                <select name="authors_id_list" id="" multiple class="form-control">
                    {% for author in author_list %}
                        {% if author in edit_obj.authors.all %}
                            <option selected value="{{ author.id }}">{{ author.name }}</option><!--默认选项加selected-->
                        {% else %}
                            <option value="{{ author.id }}">{{ author.name }}</option>
                        {% endif %}
                    {% endfor %}
                </select>
            </div>
            <div style="display: none">
                <input type="text" value="{{ edit_obj.nid }}" name="id">
            </div>
            <div>
                <input type="submit" class="btn btn-default">
            </div>
        </form>
    </div>
</div>


</body>
</html>

路由

from django.urls import path,re_path
from app01 import views

urlpatterns = [
    re_path(r'^$',views.books),
    path('add_book/', views.add_book),
    re_path(r'books/(\d+)/change/$',views.change_book),  # id 作为参数传递
    re_path(r'books/(\d+)/del/$',views.del_book),
]
Django中,查询过滤是指使用特定条件来筛选数据库中的记录。这可以通过使用查询集(QuerySet)的方法来实现。引用中提到了使用继承的原理进行查询过滤的例子。当你想要创建一个新的记录时,你可以将pk和id都设置为None,然后保存记录。这样,Django会为你自动生成一个新的主键值。例如,你可以使用以下代码来创建一个新的Blog实例并保存它: ```python django_blog = Blog(name='Django', tagline='Django is easy') django_blog.pk = None django_blog.id = None django_blog.save() ``` 在这个例子中,django_blog.pk将会是一个新的主键值。 另外,如果你使用了继承,查询过滤可能会更加复杂。引用提供了一个使用子类进行查询过滤的例子。你可以定义一个子类ThemeBlog继承自Blog,并添加一个额外的字段theme。然后,你可以使用以下代码创建一个ThemeBlog实例并保存它: ```python django_blog = ThemeBlog(name='Django', tagline='Django is easy', theme='python') django_blog.save() ``` 在这个例子中,django_blog.pk将会是一个新的主键值。 需要注意的是,当使用get()方法查询数据库时,如果有多个记录满足查询条件,Django会抛出MultipleObjectsReturned异常。这在引用中有提到。在这种情况下,你可以使用其他查询集的方法来获取满足条件的记录。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Django数据库查询参考及常用过滤方法](https://blog.youkuaiyun.com/qq_27664967/article/details/105096404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值