Django中对数据的改、删、查

发布时间 2024-01-02 11:49:12作者: Way*yy

如何动态的展示我们的数据

1、先获取到数据库中的信息内容
	def user_info(request):
    	userinfo_all = models.user_info.objects.all() # 获取所有的用户对象
        # <QuerySet [<user_info: user_info object>, <user_info: user_info object>, <user_info: user_info object>, <user_info: user_info object>, <user_info: user_info object>]>
        # 返回图书馆的管理页面
        return render(request, 'user_info_table.html', locals())  # loclas 获得当前局部内的所有变量
    	"""得到这些用户对象我们就可以在前端使用for循环的方法遍历取出所有对象,然后再用对象.字段名得到每个用户的准确信息"""
2、动态展示数据内容
# 在展示页面利用for循环
	动态展示数据库里面的信息
    """
        <tbody>
               {% for user in userinfo_all %} 使用for循环遍历出来这个对象,获取到详细的数据
                 <tr class="text-center">
                     <td>{{ user.id }}</td>
                     <td>{{ user.name }}</td>
                     <td>{{ user.password }}</td>
                     <td class="text-center">
                     <a href="/update_user/?user_id={{ user.id }}"
                     class="btn btn-success btn-xs">修改</a>
                     <a href="/delete/?user_id={{ user.id }}"
                     class="btn btn-danger btn-xs">删除</a>
                 </td>
                 </tr>
                 {% endfor %}
       </tbody>
    """

修改用户在表格中的数据

1、用户点击编辑按钮会跳转到修改用户信息页面,我们可以在前端写一个在返回页面的时候携带一些参数,比如说用户的ID
	<a href="/update_user/?user_id={{ user.id }}"
    
2、在获取用户的ID
	# 因为在发起请求的时候是GET请求,所以要使用GET的方式获取
	user_id = request.GET.get("user_id")
    # 根据用户的ID获取到用户的信息
    alter = models.user_info.objects.filter(id=user_id).first()
    """注意:这里一定要加上first,要不然获得的是一个对象列表,而不是一个对象"""
    user_info object # 有first
	<QuerySet [<user_info: user_info object>]> # 没有first
    # 判断请求方式
    if request.method == 'POST':
        # 获得用户修改的数据
        hidden = request.POST.get("hidden_id")
        username = request.POST.get("username")
        password = request.POST.get("password")
        # 将数据重新写入到数据库
        models.user_info.objects.filter(id=hidden).update(name=username, password=password)
        # 重新返回用户管理页面
        return redirect('/user_info_table/')
    # 通过id获得用户对象,然后将用户对象放到locale的里面
    return render(request, 'update_user.html', locals())

Django中对数据的改、删、查

# 增加
方法一:
    def register(request):			   # 数据库字段 = input框的name值 
        models.user_info.objects.create(name=username, password=password)
方法二:
	obj = models.表名(类名)(usernam='',password='')
    obj.save
# 删除数据
1、物理删除:
    def delete(request):
        user_id = request.GET.get("user_id")
        models.User_info.objects.filter(pk=user_id).delete() # 删除一个主键id为user_id的信息
2、软删除:
	软删除的意思是不直接从硬盘中删除数据,而是在表中添加一个is_delete的字段
    它的用法就是,正常数据这个字段值为0,如果删除了就is_delete=1
    "每次删除更新这个字段信息就行了"
    	id   username   password  age  gender is_delete
        1		1		1		1		1		0
        1		1		1		1		1		1
        1		1		1		1		1		0
        1		1		1		1		1		0
        1		1		1		1		1		0
        1		1		1		1		1		1
    # 查询的时候怎么区分是正常数据还是已经被删除的数据?
    models.表名(类名).objects.filter(is_delete=0).all()
# 修改用户数据
def update_user(request):
	models.user_info.objects.filter(id=hidden).update(name=username, password=password)
    # 修改id为hidden的信息
    
# 查看
	# 方式一
	def user_info(request):
    	userinfo_all = models.user_info.objects.all() # 获取所有的信息
    # 方式二
    def update_user(request):
        # 获取用户的ID
        user_id = request.GET.get("user_id")
        # 通过ID筛选出用户的信息
        alter = models.user_info.objects.filter(id=user_id).first() # 只获取id为user_id的对象
        """
        	易错点:如果后面不加first则会拿到个对象列表,而不是一个对象
        """
        
动态展示数据库里面的信息
"""
	如何告诉后端用户想要编辑哪条数据?
  	将编辑按钮所在的那一行数据的主键值发送给后端
  	利用url问号后面携带参数的方式
	<tbody>
           {% for user in userinfo_all %} 使用for循环遍历出来这个对象,获取到详细的数据
             <tr class="text-center">
                 <td>{{ user.id }}</td>
                 <td>{{ user.name }}</td>
                 <td>{{ user.password }}</td>
                 <td class="text-center">
                 <a href="/update_user/?user_id={{ user.id }}"
                 class="btn btn-success btn-xs">修改</a>
                 <a href="/delete/?user_id={{ user.id }}"
                 class="btn btn-danger btn-xs">删除</a>
             </td>
             </tr>
             {% endfor %}
   </tbody>
"""

Django ORM中创建表关系

"""
表与表之间的关系
	一对多
	
	多对多
	
	一对一
	
	没有关系

判断表关系的方法:换位思考
"""
图书表

出版社表

作者表

作者详情表
"""
图书和出版社是一对多的关系 外键字段建在多的那一方 book
	
图书和作者是多对多的关系 需要创建第三张表来专门存储

作者与作者详情表是一对一
"""
from django.db import models

# Create your models here.


# 创建表关系  先将基表创建出来 然后再添加外键字段
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    # 总共八位 小数点后面占两位
    """
    图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
    """
    publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联
    """
    如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
    如果你自作聪明的加了_id那么orm还是会在后面继续加_id
    
    后面在定义ForeignKey的时候就不要自己加_id
    """


    """
    图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐建在查询频率较高的一方
    """
    authors = models.ManyToManyField(to='Author')
    """
    authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
    让orm自动帮你创建第三张关系表
    """


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    """
    作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
    """
    author_detail = models.OneToOneField(to='AuthorDetail')
    """
    OneToOneField也会自动给字段加_id后缀
    所以你也不要自作聪明的自己加_id
    """

class AuthorDetail(models.Model):
    phone = models.BigIntegerField()  # 或者直接字符类型
    addr = models.CharField(max_length=32)


"""
	orm中如何定义三种关系
		publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联
		
		authors = models.ManyToManyField(to='Author')
		
		author_detail = models.OneToOneField(to='AuthorDetail')
		
		
		ForeignKey、OneToOneField会自动在字段后面加_id后缀
"""

# 在django1.X版本中外键默认都是级联更新删除的
# 多对多的表关系可以有好几种创建方式 这里暂且先介绍一种

Django的生命流程图

1. 用户先从浏览器发起HTTP请求
2. 请求就来到了web服务器(web服务网关接口)
	socktet部分
    wsgiref模块实现的socket服务端
    """
    	1. 请求来的时候,把HTTP格式的数据封装打包成一个字典
    	2. 响应走的时候,把数据封装成符合HTTP格式的数据返回给浏览器
    """
    # 后面还给它改成uwsgi服务器
    # wsgiref、uwsgi他们两个也都会遵循一个协议:WSGI协议
    https://www.yuque.com/liyangqit/cbndkh/evyps8
3. Django应用
4. 中间件
5. 路由层
6. 视图层
7. 模板层
8. DB
"""混合项目:前端页面和Python代码都写在一个项目里面,前后端分离,前端是一个项目,后端是一个项目,中间通过json格式的数据进行数据传输"""

微信图片_20230728120410

fooloop方法

{% for %}标签内部模板变量forloop
在{% for %}循环内部,可以访问一个名为forloop的模板变量。这个变量有若干属性,通过它们可以获知循环进程的一些信息。

 

# forloop.counter
forloop.counter 的值是一个整数,表示循环的次数。这个属性的值从 1 开始,因此第一次循环时,forloop.counter 等于 1 。

{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

# forloop.counter0
forloop.counter0 与 forloop.counter 类似,不过是从零开始的。第一次循环时,其值为 0 。

 

# forloop.revcounter
forloop.revcounter的值是一个整数,表示循环中剩余的元素数量。第一次循环时, forloop.revcounter 的值是序列中要遍历的元素总数。最后一次循环时, forloop.revcounter的值为 1 。

 

# forloop.revcounter0
forloop.revcounter0 与 forloop.revcounter类似,不过索引是基于零的。第一次循环时, forloop.revcounter0的值是序列中元素数量减去一。最后一次循环时, forloop.revcounter0 的值为 0 。

 

# forloop.first
forloop.first 是个布尔值,第一次循环时为 True 。需要特殊处理第一个元素时很方便:

{% for object in objects %}
    {% if forloop.first %}
        <li class="first">
    {% else %}
        <li>
    {% endif %}
    {{ object }}
    </li>
{% endfor %}

# forloop.last
forloop.last是个布尔值,最后一次循环时为True 。经常用它在一组链接之间放置管道符号:

{% for link in links %}
    {{ link }}{% if not forloop.last %} | {% endif %}
{% endfor %}


上述模板代码的输出可能是:

Link1 | Link2 | Link3 | Link4

此外,还经常用它在一组单词之间放置逗号:

<p>Favorite places:</p>
{% for p in places %}
    {{ p }}{% if not forloop.last %}, {% endif %}
{% endfor %}

forloop.parentloop

在嵌套的循环中, forloop.parentloop引用父级循环的 forloop 对象。下面举个例子:

{% for country in countries %}
    <table>
    {% for city in country.city_list %}
        <tr>
        <td>Country #{{ forloop.parentloop.counter }}</td>
        <td>City #{{ forloop.counter }}</td>
        <td>{{ city }}</td>
        </tr>
    {% endfor %}
    </table>
{% endfor %}


小贴士
forloop 变量只在循环内部可用。模板解析器遇到 {% endfor %} 时, forloop 随之消失。 
上下文和 forloop 变量 
在 {% for %} 块中,现有变量会让位,防止覆盖 forloop 变量。Django 把移动的上下文放到 
forloop.parentloop 中。通常,你无须担心,但是如果有名为 forloop 的模板变量(不建议这 
么做),在 {% for %} 块中会重命名为 forloop.parentloop 。