Django自学笔记 5-1 基础增删查改

本文详细介绍了在Django框架中,如何通过交互式命令行进行模型的增删改查操作,包括创建Person对象、数据插入、查询、更新和删除。重点展示了如何利用`python manage.py shell`快速测试数据库操作逻辑。

————总目录——前言——框架版本————

======================= 大爽歌作,made by big shuang =======================

一、基础增删查改

第四章介绍了模型类models.Model和创建模型,相当于介绍了数据库表和如何创建数据库表。
这一章将介绍如何使用模型对数据库表进行增删查改,

注意:修改了模型类models.Model后一定要更新数据库(详见第四章第一节第三部分),如果数据库表进行增删查改则不必。

0 - 超实用工具介绍——Django下的交互式命令行

Django项目中,如果在项目实际使用的代码中,通过增删查改实现对应的业务逻辑,
测试起来会比较麻烦,(往往需要运行项目,按照一定的业务逻辑去重复性的手动测试),这种情况下,使用代码进行测试是一种更好的选择。

所以我们需要一个场景,可以直接运行代码,以方便我们测试业务代码逻辑本身是否正确。
这个时候,python的交互式命令行,就是一个十分有用的工具了,
但是导入项目本身依赖的配置和文件则有点麻烦,而Django本身则提供了一个方法解决这个问题。
在项目所在文件夹下打开命令行窗口,运行

python manage.py shell

即可开启导入了项目设置的命令行窗口,这时要使用项目中的某一代码文件中的代码,则像项目中编写代码那样正常导入即可。

示例效果如下

F:\my_projects\demo2>python manage.py shell
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from myapp import models
>>>

1 - 增(Create)——添加数据

myapp/models.py如下:

from django.db import models

class Person(models.Model):
    gender = (
        ('male', '男'),
        ('female', '女'),
    )

    name = models.CharField(max_length=60)
    sex = models.CharField(max_length=32, choices=gender, default='男')

要在数据库中增加记录,在Django下的交互式命令行执行代码如下

>>> from myapp.models import Person
>>> person = Person(name="Big Shuang", sex="male")
>>> person.save()

即可在数据库表中成功添加一行记录,如下

idnamesex
1Big Shuangmale

然后我们看下执行的代码,其实主要就是后两行
第二行创建一个 Person 实例,这个时候只是在程序中有了,但是数据库中还没有
第三行对该实例调用save方法,才会存储数据到数据库中。

2 - 查(Select)——查找数据

查找是个很复杂功能,这里只介绍一点基础的方法,详细的会在本章下一节展开讲讲。

  • 使用Model.objects.get(id=...),通过id查询Model表数据,其中Model是对应的模型名,该方法返回一个实例对象,查询不到会报错。
    示例如下(承接上文命令行中代码)
>>> p = Person.objects.get(id=1)
>>> p
<Person: Person object (1)>
>>> p.name
'Big Shuang'
>>> p.sex
'male'
  • 使用Model.objects.all()获取Model表所有数据,
    其中Model是对应的模型名,该方法返回一个QuerySet对象,该对象也会在下一节展开讲。
    QuerySet对象可使用遍历和切片操作。
    示例如下(承接上文命令行中代码)
>>> persons = Person.objects.all()
>>> p = persons[0]
>>> p.name
'Big Shuang'
>>> p.sex
'male'

3 - 改(Update)——修改数据

Django里面,修改数据很简单,修改一下模型实例的属性就可以,然后调用save方法同步到数据库表即可。
示例如下(承接上文命令行中代码)

>>> p = Person.objects.get(id=1)
>>> p.name = "Li hua"
>>> p.save()

执行后数据库表Person内容更新如下

idnamesex
1Li huamale

4 - 删(Delete)——删除数据

删除数据也很简单。
模型实例调用delete方法即可删除数据,
同时不止模型实例可以调用delete方法,本文第二部分提到的QuerySet也可以调用delete方法删除QuerySet中所有行的数据。

简单示例如下(承接上文命令行中代码)

>>> p = Person.objects.get(id=1)
>>> p.delete()
(1, {'myapp.Person': 1})

执行后数据库表Person中对应的数据将被删除。

Django实现增删查改主要依赖于models,下面从不同方面介绍其实现方法: ### 定义模型 在 `models.py` 中定义模型,每个类对应数据库中的一张表。例如,创建一个 `Publisher` 模型: ```python from django.db import models class Publisher(models.Model): name = models.CharField(max_length=255) address = models.CharField(max_length=255) def __str__(self): return self.name ``` ### 实现增删查改操作 #### 增加数据 在视图函数中创建新的模型实例并保存到数据库。 ```python from .models import Publisher def add_publisher(request): if request.method == 'POST': name = request.POST.get('name') address = request.POST.get('address') publisher = Publisher(name=name, address=address) publisher.save() return HttpResponse('Publisher added successfully') ``` #### 删除数据 通过模型实例的 `delete` 方法删除数据。 ```python from .models import Publisher def delete_publisher(request, publisher_id): try: publisher = Publisher.objects.get(id=publisher_id) publisher.delete() return HttpResponse('Publisher deleted successfully') except Publisher.DoesNotExist: return HttpResponse('Publisher not found') ``` #### 查询数据 使用模型的管理器(如 `objects`)进行数据查询。 ```python from .models import Publisher def get_publishers(request): publishers = Publisher.objects.all() # 可以对查询结果进行进一步处理,如过滤、排序等 filtered_publishers = Publisher.objects.filter(name__startswith='A') return render(request, 'publishers.html', {'publishers': publishers}) ``` #### 修改数据 先获取要修改的模型实例,然后更新其属性并保存。 ```python from .models import Publisher def update_publisher(request, publisher_id): try: publisher = Publisher.objects.get(id=publisher_id) if request.method == 'POST': name = request.POST.get('name') address = request.POST.get('address') publisher.name = name publisher.address = address publisher.save() return HttpResponse('Publisher updated successfully') return render(request, 'update_publisher.html', {'publisher': publisher}) except Publisher.DoesNotExist: return HttpResponse('Publisher not found') ``` ### 使用序列化器(结合rest_framework框架) 如果使用 `rest_framework` 框架,可以定义序列化器来处理增删查改操作。 ```python from rest_framework import serializers from .models import Publisher class PublisherModelSerializer(serializers.ModelSerializer): class Meta: model = Publisher fields = '__all__' def create(self, validated_data): return Publisher.objects.create(**validated_data) def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.address = validated_data.get('address', instance.address) instance.save() return instance ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值