class Grade(models.Model):
id = models.AutoField(verbose_name='自增id', name="id", primary_key=True)
grade_name = models.CharField(verbose_name="班级名称", name="grade_name", max_length=200)
age = Models.IntField()
create_time = models.DateTimeField(verbose_name='创建时间',name="create_time", auto_now_add=True) # 第一次赋值
update_time = models.DateTimeField(verbose_name='最后一次更新时间',name="update_time", auto_now=True) # 第二次赋值
class Meta:
db_table = "app_grade"
ordering=["-update_time","create_time"]
表示查询集,是从数据库中获取到的Model集合,集合中每个元素都是我们的Model对象
queryset=Grade.objects.all()
for grade in queryset:
print(grade.crade_name)
类似于sql中的where
queryset=Grade.objects.filter(grade_name ='三班')
for grade in queryset:
print(grade.crade_name)
返回符合要求的一条数据,只返回一条,当未找到数据或者是返回的数据超过一条都会抛出异常,因此需要做异常捕捉处理。一般查询条件用主键id,这唯一对应一条数据。
grade=Grade.objects.get(id=1)
print(grade.crade_name)
排除符合条件的值
grade=Grade.objects.exclude(grade_name ='三班')
for grade in queryset:
print(grade.crade_name)
指定返回的列,相当于 select grade_name create_time from student.
返回的对象包含的数据类型是 指定表列的字典dict结构,所以代码中取值略有不同
grade=Grade.objects.values('grade_name','create_name')
for grade in queryset:
print(grade["crade_name"])
一般结合values用
grade=Grade.objects.values('grade_name').distinct()
for grade in queryset:
print(grade["crade_name"])
上面的查询都是用的 ‘=’ ,其实还支持的表达式有:
__gt
__gte
__lt
__lte
__in
__contains
__year
__month
__day
一些基础的组合是可以链式调用的,不必那么死板。
grade=Grade.objects.filter(id__in=(1,3,4)).filter(name__contains='张')
for grade in queryset:
print(grade.name)
save和create都行
grade=Grade()
grade.grade_name='四班'
grade.save()
# 或者
grade = {"grade_name": '四班'}
Grade.objects.create(**grade)
可以用save或者update函数。 逻辑很简单:先查出来数据,再对查出来的对象修改之后再保存进去即可。
基础写法
grade=Grade.objects.get(id=1)
grade.grade_name='四班'
grade.save()
链式写法
grade=Grade.objects.get(id=1).update(garde_name='四班')
批量更新
grade=Grade.objects.update(garde_name='四班')
grade = Grade.objects.get(id=1)
grade.delete()
d = Grade.objects.filter(garde__contains='四').delete()
print(d)
d = Grade.objects.all().delete()
如果删除的数据中有外键,且on_delete 参数值为 CASCADE 则外键关联 主表 中的数据也会被删除
grade = Grade.objects().all()
grade.age+=1
grade.save()
上面的语句实际的执行流程是:先从数据库查出来放在内存,赋予新的值后再更新到数据库。 改成下面的样式
grade = Grade.objects().all()
grade.age=F(age)+1
grade.save()
grade.refresh_from_db()#必须执行此处的刷新才能生效
实际执行流程是,直接在数据库执行update, 减少一次查询操作
用于执行多个where条件。 用起来比较方便,代码啥的也比较简洁,推荐使用
Grade.objects().filter(Q(grade_name=‘三班’)&Q(age__gt=30))