__str__ 和 __repr__ Django中的一对多(外键约束) 进阶版一对多

__repr__ 是内置数据类型打印时 ,调用 repr方法

一丶__str____repr__

class Publish(models.Model):
   pname = models.CharField(max_length=32, unique=True)
   paddr = models.CharField(max_length=32)


   # 这是调用 __str__ 方法打印的结果, __str__是让程序员看的
   # 打印'对象'时,先找__str__方法,如果没有__str__方法,才找__repr__方法,在没有就去父类去找
   def __str__(self):
       return f'{self.pname}***{self.paddr}'


   #这是调用 __repr__ 方法打印的结果, __repr__是让程序看的
   #打印python默认数据类型时,直接调用的是__repr__方法
   # 内置数据对象,直接调用 __repr__方法
   def __repr__(self):
       return f'{self.pname}--{self.paddr}'

   # 让__repr__ 和 __str__相等 ,一般来说使用str就足够了
   __repr__=__str__

 

 

 

二丶Django中的一对多(外键约束)

在models.py文件下建立具有外键约束的表

from django.db import models

# '一'的一方:
class Publish(models.Model):
   pname=models.CharField(max_length=32,unique=True)
   paddr=models.CharField(max_length=32)

# '多'的一方:
class Book(models.Model):
   bname=models.CharField(max_length=32,unique=True)
   bprice=models.CharField(max_length=32)
   

   pid=models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 外键约束,
   # 当执行完迁移命令时,pid字段在数据库中会是pid_id的存在
  # 重点:
      # 1. 数据库中的:pid_id是字段,对于类来说是属性. 可以直接放一个数值或其他类型的数据
      # 2. 类中的pid字段则是一个对象,是关联外键的对象.使用时必须存放一个对象
   
  # 参数说明:
to:  # 关联外键的那张表,也就是类名
       
           on_delete=None, # models.CASCADE 级联删除,
            # models.SET(1) 将当前字段的值设置成1
                 # models.SET_DEFAULT 设置默认值, 需要设置default:default=11
                  # models.SET_NULL 设置为空,需要设置 : null=True
                      # models.DO_NOTHING 什么都不做,关联的数据删除后不影响当前字段的值
           
      related_name=None, # 反向查询字段可以不用 表名小写,可以改名了
       
        related_query_name=None,
       
        limit_choices_to=None,  # 限制关联字段的对象范围
       
      parent_link=False,
       
      to_field=None,  # 被关联对象的用于关联的字段. 默认情况, Django 使用被关联对象的主键
       
      db_constraint=True, # 这个就是保留跨表查询的便利(双下划线跨表查询```)

三丶进阶版一对多项目

说明:

# 两张表: 一张出版社表, 一张图书表
# 假设: 多本图书对应一个出版社, 图书表建立外键:如上建表👆
   

# 查图书表时,需要查看所属的出版社

# 添加图书时,需要查询所有的出版社,以下拉选择框的形式进行选择

# 更改时图书表需要,也需要查询所有的出版社,以下拉选择框的形式进行选择. 下拉框要有默认值(和数据库存在的数据一样)

# 删除,表设置了级联删除 on_delete=models.CASCADE, 删除出版社时,图书表中所对应的数据也一起被删除

 

####  图书
def book_list(request):
   all_books = models.Book.objects.all().order_by('pk')
   return render(request, 'book_list.html', {'all_books': all_books})
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>图书管理系统</title>
   <link rel="stylesheet" href="/static/css/bootstrap.min.css">
   <link rel="stylesheet" href="/static/css/dashboard.css">
   <link rel="icon" href="/static/imgs/user.png">
   <style>
       .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th{
           vertical-align: middle;
      }
   </style>
</head>

<body>

<nav class="navbar navbar-inverse navbar-fixed-top">
   <div class="container-fluid">
       <div class="navbar-header">
           <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
                   aria-expanded="false" aria-controls="navbar">
               <span class="sr-only">Toggle navigation</span>
               <span class="icon-bar"></span>
               <span class="icon-bar"></span>
               <span class="icon-bar"></span>
           </button>
           <a class="navbar-brand" href="#">图书管理系统</a>
       </div>
       <div id="navbar" class="navbar-collapse collapse">
           <ul class="nav navbar-nav navbar-right">
               <li><a href="/index/">主页</a></li>
               <li><a href="#">配置</a></li>
               <li><a href="#">简介</a></li>
               <li><a href="#">帮助</a></li>
           </ul>
           <form class="navbar-form navbar-right">
               <input type="text" class="form-control" placeholder="搜索...">
           </form>
       </div>
   </div>
</nav>

<div class="container-fluid">
   <div class="row">
       <div class="col-sm-3 col-md-2 sidebar">
           <ul class="nav nav-sidebar">
               <li><a href="/publish_list/">出版社管理 </a></li>
               <li><a href="/book_list/">图书管理</a></li>
           </ul>
       </div>
       <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">

           <h2 class="sub-header">图书列表</h2>
           <div class="table-responsive">
               <a href="/book_add/" class="btn btn-info btn-sm">添加图书</a>
               <table class="table table-striped table-hover">
                   <thead>
                   <tr>
                       <th>#</th>
                       <th>序号</th>
                       <th>图书编号</th>
                       <th>图书名称</th>
                       <th>图书价格</th>
                       <th>图书出版社</th>
                       <th>操作</th>
                   </tr>
                   </thead>
                   <tbody>
<!-- book 是图书对象, all_books是对象列表QuerySet -->                        
                  {% for book in all_books %}
                       <tr>
                           <td>
                               <input type="checkbox" >
                           </td>
                           <td>{{ forloop.counter }}</td>
                           <td>{{ book.pk }}</td>
                           <td>{{ book.bname }}</td>
                           <td>¥{{ book.bprice }}</td>
                       <!-- book是图书对象, .pid操作的关联的出版社对象 -->
                           <td>{{ book.pid.pname }}</td>
                           <td>
                               <a class="btn btn-warning btn-sm" href="/book_edit?pk={{ book.pk }}">编辑</a>
                               <a class="btn btn-danger btn-sm" href="/book_del?pk={{ book.pk }}">删除</a>
                           </td>
                       </tr>
                  {% endfor %}
                   
                   </tbody>
               </table>
           </div>
       </div>
   </div>
</div>


</body>
</html>

 

def book_add(request):
   error, bn, bp, pub_sel = '', '', '', ''
   all_publish = models.Publish.objects.all().order_by('pk')

   if request.method == 'POST':
       bn = request.POST.get('bname')
       bp = request.POST.get('bprice')
       pub_sel = request.POST.get('pub-sel')
       print('zheshi', pub_sel)
       if not bn:
           error = '内容不允许为空'
       elif models.Book.objects.filter(bname=bn):
           error = '书籍已经存在'
       else:
           # 以为 数据库中的字段 pid_id 添加. 只是数值添加一一对应 . 推荐使用
           models.Book.objects.create(bname=bn, bprice=bp, pid_id=pub_sel)

           # 以orm操作类中的pid属性. 这个存的必须是一个对象,所有需要查出来一个对象.
           # models.Book.objects.create(bname=bn, bprice=bp, pid=models.Publish.objects.filter(pk=pub_sel).first())

           return redirect(to='/book_list/')

   res = {'all_publish': all_publish, 'error': error, 'bname': bn, 'bprice': bp, }
   print(res)
   return render(request, 'book_add.html', res)
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>图书管理系统</title>
   <link rel="stylesheet" href="/static/css/bootstrap.min.css">
   <link rel="stylesheet" href="/static/css/dashboard.css">
   <link rel="icon" href="/static/imgs/user.png">
   <style>

   </style>
</head>

<body>

<nav class="navbar navbar-inverse navbar-fixed-top">
   <div class="container-fluid">
       <div class="navbar-header">
           <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
                   aria-expanded="false" aria-controls="navbar">
               <span class="sr-only">Toggle navigation</span>
               <span class="icon-bar"></span>
               <span class="icon-bar"></span>
               <span class="icon-bar"></span>
           </button>
           <a class="navbar-brand" href="#">图书管理系统</a>
       </div>
       <div id="navbar" class="navbar-collapse collapse">
           <ul class="nav navbar-nav navbar-right">
               <li><a href="/index/">主页</a></li>
               <li><a href="#">配置</a></li>
               <li><a href="#">简介</a></li>
               <li><a href="#">帮助</a></li>
           </ul>
           <form class="navbar-form navbar-right">
               <input type="text" class="form-control" placeholder="搜索...">
           </form>
       </div>
   </div>
</nav>

<div class="container-fluid">
   <div class="row">
       <div class="col-sm-3 col-md-2 sidebar">
           <ul class="nav nav-sidebar">
               <li><a href="/publish_list/">出版社管理 </a></li>
               <li><a href="/book_list/">图书管理</a></li>
           </ul>
       </div>
       <div class="col-sm-8 col-sm-offset-3 col-md-10 col-md-offset-2 main">

           <h2 class="sub-header">图书添加</h2>
           <div class="panel panel-success">
               <div class="panel-heading ">图书添加</div>
               <div class="panel-body">
                   <form class="form-horizontal" action="" method="post">
                       <div class="form-group">
                           <label for="bname" class="col-sm-2 control-label">图书名称</label>
                           <div class="col-sm-6">
                               <input type="text" class="form-control" id="bname" value="{{ bname }}" name="bname"
                                      placeholder="请填写图书名称">
                           </div>
                           <label class=" control-label text-danger" id="error">{{ error }}</label>

                       </div>
                       <div class="form-group">
                           <label for="bprice" class="col-sm-2 control-label">图书的价格</label>
                           <div class="col-sm-6">
                               <input type="text" class="form-control" id="bprice" value="{{ bprice }}" name="bprice"
                                      placeholder="请输入图书的价格">
                           </div>
                       </div>
                       <div class="form-group">
                           <label class="col-sm-2 control-label">图书的出版社</label>
                           <div class="col-sm-6">
                               <select name="pub-sel" id="" class="form-control">
                                  {% for publish in all_publish %}
                                       <option value="{{ publish.pk }}">{{ publish.pname }}</option>
                                  {% endfor %}
                               </select>
                           </div>
                           <label class=" control-label text-danger" >{{ error2 }}</label>
                       </div>
                       <div class="form-group">
                           <div class="col-sm-offset-2 col-sm-10">
                               <button type="submit" class="btn btn-info ">提交</button>
                               <button type="reset" class="btn btn-warning ">重置</button>
                           </div>
                       </div>
                   </form>

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

<script src="/static/js/jquery-1.11.1.min.js"></script>
<script>
   $(function () {
       $(':reset').click(function () {
           $('.text-danger').hide()
      })
  })
</script>
</body>
</html>

 

# 更新编辑
def book_edit(request):
    error, bn, bp = '', '', ''
    pk = request.GET.get('pk')
    ret = models.Book.objects.filter(pk=pk).first()
    all_publish = models.Publish.objects.all().order_by('pk')

    if not ret:
        return HttpResponse('编辑内容不存在')

    if request.method == 'POST':
        bn = request.POST.get('bname')
        bp = request.POST.get('bprice')
        pub_sel = request.POST.get('pub-sel')

        if not bn:
            error = '内容不允许为空'
        else:
            # 更细字段的值
            ret.bname = bn
            ret.bprice = bp
            
########## 重点: pid_id是数据库中的字段,操作的是类的属性. 不对象类型的数据
            ret.pid_id = pub_sel
########## 重点: pid 是类的属性,操作的另一个类实例的对象. 只能放对象类型数据
            ret.pid=models.Book.objects.filter(pk=pub_sel).first()
            
            # 保存
            ret.save()
			# 跳转
            return redirect(to='/book_list/')
        
	# 往前端页面传参
    res = {'obj': ret, 'error': error, 'all_publish': all_publish, 'bn': bn, 'bp': bp}
    return render(request, 'book_edit.html', res)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书管理系统</title>
    <link rel="stylesheet" href="/static/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/css/dashboard.css">
    <link rel="icon" href="/static/imgs/user.png">
    <style>

    </style>
</head>

<body>

<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
                    aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">图书管理系统</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
            <ul class="nav navbar-nav navbar-right">
                <li><a href="/index/">主页</a></li>
                <li><a href="#">配置</a></li>
                <li><a href="#">简介</a></li>
                <li><a href="#">帮助</a></li>
            </ul>
            <form class="navbar-form navbar-right">
                <input type="text" class="form-control" placeholder="搜索...">
            </form>
        </div>
    </div>
</nav>

<div class="container-fluid">
    <div class="row">
        <div class="col-sm-3 col-md-2 sidebar">
            <ul class="nav nav-sidebar">
                <li><a href="/publish_list/">出版社管理 </a></li>
                <li><a href="/book_list/">图书管理</a></li>
            </ul>
        </div>
        <div class="col-sm-8 col-sm-offset-3 col-md-10 col-md-offset-2 main">

            <h2 class="sub-header">图书更新</h2>
            <div class="panel panel-success">
                <div class="panel-heading ">图书更新</div>
                <div class="panel-body">
                    <form class="form-horizontal" action="" method="post">
                        <div class="form-group">
                            <label for="bname" class="col-sm-2 control-label">图书名</label>
                            <div class="col-sm-6">

                                <input type="text" class="form-control" id="bname" value="{{ obj.bname }}" name="bname"
                                       placeholder="请填写图书名">

                            </div>
                            <label class=" control-label text-danger" id="error">{{ error }}</label>

                        </div>
                        <div class="form-group">
                            <label for="bprice" class="col-sm-2 control-label">图书价格</label>
                            <div class="col-sm-6">
                                <input type="text" class="form-control" id="bprice" value="{{ obj.bprice }}"
                                       name="bprice"
                                       placeholder="请输入图书价格">
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="col-sm-2 control-label">图书的出版社</label>
                            <div class="col-sm-6">
                                <select name="pub-sel" id="" class="form-control">
                                    {% for publish in all_publish %}

                                        {% if obj.pid_id == publish.pk %}
                                            <option selected value="{{ publish.pk }}">{{ publish.pname }}</option>
                                        {% else %}
                                            <option  value="{{ publish.pk }}">{{ publish.pname }}</option>
                                        {% endif %}

                                    {% endfor %}
                                </select>
                            </div>
                        </div>

                        <div class="form-group">
                            <div class="col-sm-offset-2 col-sm-10">
                                <button type="submit" class="btn btn-info ">提交</button>
                                <button type="reset" class="btn btn-warning ">重置</button>
                            </div>
                        </div>
                    </form>

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

<script src="/static/js/jquery-1.11.1.min.js"></script>
<script>
    $(function () {
        $(':reset').click(function () {
            $('#error').hide()
        })
    })
</script>
</body>
</html>

 

# 删除图书
def book_del(request):
    pk=request.GET.get('pk')
    ret=models.Book.objects.filter(pk=pk).first()
    if not ret:
        return  HttpResponse('删除内容不存在哦!!!')
	# 删除对象
    ret.delete()
	# 跳转到 查询页面
    return  redirect(to='/book_list')

项目地址:不告诉你哦~~~

posted on 2020-03-02 12:06  向往1  阅读(185)  评论(0编辑  收藏  举报

导航

……