Python-Django的filter和exclude过滤器的学习
typora-copy-images-to: pic
Python-Django学习
filter和exclude是Django的if/else
filter()表⽰匹配满⾜要求的数据,⽽exclude()则表⽰匹配不满⾜要求的数据。
需要注意的是filter()括号⾥⾯有很多的匹配选项
这⾥只需要在pycharm⾥⾯打⼊需要判断的字符变量,然后就可以看到很多的末尾带有
LT / GT
先来说⼀下lt-->less than, gt-->great than
其实就是⼤于和等于,注意有⼏个是末尾带有eq 的那个才是⼤于等于或者⼩于等与!
代码实例:
def input(request):
for i in range(1,15):
student = Student()
flag = random.randint(0,100)
student.s_name = "Tony"+str(flag)+random.choice("abcdefghijklmnopqrstuvwxyz")
student.s_age = flag
student.s_sex = random.choice([0,1])
student.save()
return HttpResponse("data input scuess !")
def show(request):
students = Student.objects.filter()
context = {
"students":students,
}
return render(request,"showDemo.html",context=context)
def delete(request):
students = Student.objects.filter(s_sex=1)
students.delete()
students = Student.objects.filter()
return render(request,"showDemo.html",context={"students":students})
这些代码⾥⾯可以看到我们⽇常最长见的判断代码的实例!很有⽤的!
2 . 创建对象的⽅式
1.直接创建对象
def input(request):
student = Student()
flag = random.randint(0,100)
student.s_name = "Tony"+str(flag)+random.choice("abcdefghijklmnopqrstuvwxyz")
student.s_age = flag
student.s_sex = random.choice([0,1])
student.save()
return HttpResponse("data input scuess !")
2.利⽤⽅法创建对象
def create_student(request):
student = ate(s_name="Qiao",s_age=22,s_sex=True)
student.save()
前者看上去会更容易理解⼀些,但是后者确实更加简单了.但是呢!第2种⽅法需要格外注意的是如果有字段没有赋值那么数据库⾥的数据将不会被设置为默认值,也就是说每⼀个字段都需要赋值才⾏!
注意我们也可以直接Student(s_name="xxx",s_age=xxx,s_sex="xx").但是这⾥的问题和上⾯的是⼀样的,必须全部赋值好,不然就会有问题。并且绝对不可以尝试重写
__init__.py
来解决这个问题django怎么学
⽅法
--对象⽅法
-可以调⽤对象的属性,也可以调⽤类的属性
--类的⽅法
-不能调⽤对象属性,只能调⽤类的属性
--静态⽅法
-啥都不可以调⽤,不能获取对象属性
-只是寄⽣在这个类⾥⾯罢了!
原因:我们正常的创建对象的习惯是建⼀个类,然后直接创建对象也就是下⾯的代码
class Class1:
def __init__(self,name,age):
self.name = name
self.age = age
if __name__ == "__main__":
class1 = Class1(name="xxx",age=xxx)#这⾥就是创建对象的⽅法了
在Django中我们建⽴了models的模型类,然后我们也可以像⾯向对象使⽤完全⼀样的⽅法来创建这样的⼀个对象。但是上⾯已经讲过了,如果直接创建的话,如果我们没有传⼊默认值,那么代码将会把它设置成空,并且我们也不可以使⽤重写init⽅法来解决这个问题,这个其实算是⼀个bug了。那么接下来的⽅法就是如何解决这个问题的了!
解决⽅案
# Create your models here.
class Student(models.Model):
s_name = models.CharField(max_length=20,db_column="name",unique=True)
s_age = models.IntegerField(db_column="age")
s_sex = models.BooleanField(max_length=2,db_column="sex")
@classmethod
def create_people(cls,name,age=100,sex=True):#这⾥创建了⼀个类⽅法
return cls(s_name=name,s_age=age,s_sex=sex)#这⾥返回了⼀个类对象
class Meta:
db_table = "Student"
def create_student(request):
student = ate_people("Qiaomo")#这⾥直接调⽤就可以了
student.save()
return HttpResponse("OK")
那么类⾥⾯的cls⼜是什么东西呢?
接下来的代码好好看看!
class A(object):
a = 'a'
@staticmethod
def foo1(name):
print 'hello', name
print A.a # 正常
print A.foo2('mamq') # 报错: unbound method foo2() must be called with A instance as first argument (got str instance instead)
def foo2(self, name):
print 'hello', name
@classmethod
def foo3(cls, name):
print 'hello', name
print A.a
print cls().foo2(name)
@staticmethod和@classmethod都可以直接类名.⽅法名()来调⽤,那他们有什么区别呢从它们的使⽤上来看,
@staticmethod不需要表⽰⾃⾝对象的self和⾃⾝类的cls参数,就跟使⽤函数⼀样。 @classmethod也不需要self参
数,但第⼀个参数需要是表⽰⾃⾝类的cls参数。如果在@staticmethod中要调⽤到这个类的⼀些属性⽅法,只能直接
类名.属性名或类名.⽅法名。⽽@classmethod因为持有cls参数,可以来调⽤类的属性,类的⽅法,实例化对象等,
避免硬编码。
也就是说在classmethod中可以调⽤类中定义的其他⽅法类的属性,但staticmethod只能通过A.a调⽤类的属性,但⽆法通过在该函数内部调⽤A.foo2()。修改上⾯的代码加以说明:
所以我们可以看到如果吧上⾯的代码修改成如下的代码:
class Student(models.Model):
s_name = models.CharField(max_length=20,db_column="name",unique=True)
s_age = models.IntegerField(db_column="age")
s_sex = models.BooleanField(max_length=2,db_column="sex")
@classmethod
def create_people(cls,name,age=100,sex=True):
cls_1 = cls()
cls_1.s_name = name
cls_1.s_age = age
cls_1.s_sex = sex
return cls_1
# return cls(s_name=name,s_age=age,s_sex=sex)
class Meta:
db_table = "Student"
代码的运⾏结果是完全相同的,我们可以看到cls就是代表了这个类⾃⼰,所以cls(⾥⾯添加的变量)其实就是赋值说需要的操作罢了!
##这样我们在联想⼀下前⾯的学习就知道,由于django的原因我们⽆法直接调⽤Student的init⽅法,但是我们却可以使⽤类⽅法的特性:调⽤Student 类的默认init⽅法,然后为其传值!
排序
order by
django这个排序和mysql的order by类似!我们可以先使⽤[类名.objects.all().orderby()]来实现排序,需要注意的是:
---1.不加order by默认是按照id进⾏排序的。
-
--2.order by⾥⾯是⼀个字符串,没有代码提⽰的需要注意。
---3.虽然没有提⽰,但是可以告诉你,就是你在models⾥⾯定义的字段名。
---4.如果想要升序排序,直接filter就可以了,但如果要降序排序需要加⼀个"-"。
下⾯是演⽰Demo
def show(request):
students = Student.objects.filter().order_by("-s_age")
context = {
"students":students,
}
return render(request,"showDemo.html",context=context)
values
如果我们需要调试数据或者吧数据转换为json的话可以使⽤这个属性!
[类名.objects.values]
可以拿到⼀个QuerySet的数据,⾥⾯有⼀个⼤列表数据,列表内部嵌套好了很多字典,每⼀个字典就是⼀个对象!这样的数据可以⽐较⽅便转换成为json数据库⽂件
def show(request):
students = Student.objects.filter().order_by("-s_age")
student_value = students.values()
for student_val in student_value:
print(student_val)
context = {
"students":students,
}
return render(request,"showDemo.html",context=context)
返回结果:
{'s_name': 'Qiaomo', 'id': 1, 's_sex': True, 's_age': 100}
{'s_name': 'Tony98h', 'id': 8, 's_sex': False, 's_age': 98}
{'s_name': 'Tony90n', 'id': 10, 's_sex': True, 's_age': 90}
{'s_name': 'Tony80c', 'id': 9, 's_sex': True, 's_age': 80}
{'s_name': 'Tony73b', 'id': 11, 's_sex': True, 's_age': 73}
{'s_name': 'Tony71e', 'id': 3, 's_sex': True, 's_age': 71}
{'s_name': 'Tony63k', 'id': 5, 's_sex': True, 's_age': 63}
{'s_name': 'Tony57x', 'id': 13, 's_sex': False, 's_age': 57}
{'s_name': 'Tony54a', 'id': 7, 's_sex': False, 's_age': 54}
{'s_name': 'Tony53a', 'id': 12, 's_sex': True, 's_age': 53}
{'s_name': 'Tony48t', 'id': 14, 's_sex': True, 's_age': 48}
{'s_name': 'Tony35i', 'id': 2, 's_sex': True, 's_age': 35}
{'s_name': 'Tony24i', 'id': 4, 's_sex': False, 's_age': 24}
{'s_name': 'Tony22p', 'id': 6, 's_sex': True, 's_age': 22}
{'s_name': 'Tony2t', 'id': 15, 's_sex': True, 's_age': 2}
其他的⽅法:
first/last
objects.all().first()/objects.all().last()
--默认是没有上⾯问题的
-
-隐藏bug
-可能会出现first和last完全相同的对象(有可能!)
--⼿动写排序算法吧!
exists
⽹络服务器的报错提⽰:
5xx的错误都是服务器崩溃了!这个很尴尬的!
其他:
2xx:请求是成功了
3xx:被转发了
4xx:客户端挂了
get的⽑病
--1.如果尝试get⼀个不存在的数据那么我们的程序会抛出⼀个500异常,
--2.如果查询对象存在多个值的时候,他还是会抛出异常,并且异常的原因就是返回的数据超过⼀个了!切⽚
--和python不太⼀样
--QuerySet[5:15] #获取第五条到第⼗五条数据
-相当于SQL语句中的limit和offset
-不需要优化算法了,直接就可以在数据库⾥⾯限制好要查询的数据了-注意这⾥的切⽚⼤多数都是左闭右开的区间
缓存集
--filter
--exclude
--all
--都不会真正的查询数据库
--只有在迭代结果集或者获取单个对象属性的时候才会查询数据库
--懒查询
查询条件
属性__运算符=值
gt
lt
gte
lte
in在某⼀集合中
contains 类似于模糊查询like
startswith 以xx开始本质也是like
endswith 以xx结束也是like
exact 精确查询
前⾯添加i,忽略⼤⼩写的匹配
iall
iget
istartswith
iendswith
icontains
.
......
django中查询条件有时区问题
关闭Django中的⾃定义时区#setting -->USE_TZ=False即可
在数据库中创建对应的时区表

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。