13.Django(单表操作:增简单查询删改补天字段问题)
Posted muyangxiaodong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13.Django(单表操作:增简单查询删改补天字段问题)相关的知识,希望对你有一定的参考价值。
-
再次明确orm与mysql的对应关系
orm mysql
类 表
类中的属性 表的字段
实例化对象 行记录(一行数据) -
方式1(不常用)
def create(request):
stu_obj = models.Student(
name = ‘牧羊小董‘,
age=21
) # 实例化一个对象
stu_obj.save() # 将和这个数据添加到数据库中
return HttpResponse("<h1>添加数据成功</h1>")
操作代码都是写道views相应的函数里面的,一下只写操作代码,位置都是一样的 -
models.Student.objects # objects可以称为一个控制器,这个控制器可以调用增删改查等其他方法,非常重要
?
stu_obj = models.Student.objects.create(
name=‘牧羊小董‘,
age=21
)
print(stu_obj) # Student object
# 通过万能的点获取它的属性
print(stu_obj.id) # 这条数据当前的id值
print(stu_obj.name) # 牧羊小董
print(stu_obj.age) # 21重要的点:以后我们对类实例化的对象比如上面的stu_obj,我们都称之为models对象
-
方式3(批量创建)
现在有200条行数据,我想将在这200条行数据插入到对应的表中,首先想到的就是for循环,循环插入。循环插入,你插入一次,就是与数据库交互一次,就会产生一次IO,这样循环插入的数据量越大,IO越多,效率越低。
# 批量创建
list1 = [models.Student(name=f‘牧羊小董{i}‘, age=21 + i) for i in range(20)]
obj = models.Student.objects.bulk_create(list1)
print(obj)
?
"""
打印的obj结果是:
[<Student: Student object>, <Student: Student object>, <Student: Student object>,
...
<Student: Student object>, <Student: Student object>, <Student: Student object>]
""" -
方式4(创建更新)
有则更新,无则添加
# 有的
models.Student.objects.update_or_create(
name =‘牧羊小董0‘, # 筛选判断条件
defaults={
‘age‘: 18,
}
)
?
?
# 没有的
models.Student.objects.update_or_create(
name=‘小计‘,
defaults={
‘age‘: 17,
}
)
单表操作— 简单查询
-
查询所有 all()
def all(request):
query_set = models.Student.objects.all()
print(query_set) # 返回一个QuerySet对象
print(query_set[1:5]) # 可以使用切片
for obj in query_set:
print(obj.name) # 遍历QuerySet对象,通过点获取里面每个models对象的name属性
return HttpResponse("<h1>数据查询完毕</h1>")
?
?
# 测试__str__功能
class Student(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
age = models.IntegerField()
?
def __str__(self):
return self.name
?
def all(request):
query_set = models.Student.objects.all()
for obj in query_set:
print(obj) # 遍历QuerySet对象,现在就直接打印name属性了
return HttpResponse("<h1>数据查询完毕</h1>")
?
操作代码都是写道views相应的函数里面的,一下只写操作代码,位置都是一样的另一个非常重要的对象:QuerSet对象,他是一个类似于列表的容器,可迭代的,里面的元素就是一个个的models对象。
-
按条件查询 filter ()
models.类名.objects.filter(条件) 返回的是QuerySet对象
query_set = models.Student.objects.filter(age=18)
print(query_set)
?
# 无论查询的结果是一个还是多个,都是返回QuerySet对象 -
按条件查找 get()
返回的都是models对象
get() 按条件查找,返回一个models对象,通过get查询的结果有且只能有一个
面试考过报错原因以及分析
obj = models.Student.objects.get(id=2)
print(obj) # 依照条件查询结果只有一个不报错
?
obj = models.Student.objects.get(age=20)
print(obj) # 依照条件查询结果可能是多个就会报错
报错:get() returned more than one Student -- it returned [这里是查询到的总数量]!
?
obj = models.Student.objects.get(id=2000)
print(obj) # 依照条件查询结果可能没有对应结果也会报错
报错:Student matching query does not exist.
单表操作—删
分为两种情况的删除 一个是QuerySet、一个是models
-
QuerySet对象
def del_(request): models.Student.objects.filter(age=20).delete() return HttpResponse("<h1>数据删除完毕</h1>")
-
models对象
def del_(request): models.Student.objects.get(id=2).delete() return HttpResponse("<h1>数据删除完毕</h1>")
-
表中数据全部删除
def del_(request): models.Student.objects.all().delete() return HttpResponse("<h1>数据删除完毕</h1>")
单表操作—改
-
方式1(update_or_create)
models.Student.objects.update_or_create( name =‘牧羊小董0‘, # 筛选判断条件 defaults={ ‘age‘: 18, } )
-
方式2(update)
models.Student.objects.filter(id=1).update(name=‘牧羊小董‘)
补充字段
坑:给已经创建好并有数据的表添加新字段的问题
我们已经创建好一个Student表了,并且也往里面插入了一些数据,此时我们要想给Student表添加一个新的字段,比如sex字段,怎么做?
先在models.py里面的Student类里面写上sex字段
class Student(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16) age = models.IntegerField() sex = models.CharField(max_length=6) def __str__(self): return self.name
然后你在Terminal里面输入命令:
python manage.py makemigrations
然后显示下面的结果:
原因:原表已经存在数据了,你想新增字段,那么原表的这些数据对应的这个字段的内容是什么?
你也没有设置这个字段默认为null,所以产生了歧义。
解决方式:
1、选择1:退出,咱们去对sex字段设置一个默认值。
sex = models.CharField(max_length=6, default=‘male‘)
2、选择2:退出。咱们去对sex字段设置一个参数:null=True
sex = models.CharField(max_length=6, null=True)
3、删除表重新构建表结构
然后重新打开Terminal,输入命令:
python manage.py makemigrations python manage.py migrate
以上是关于13.Django(单表操作:增简单查询删改补天字段问题)的主要内容,如果未能解决你的问题,请参考以下文章
Django学习第6篇:Django之ORM单表操作(增删改查)