❶ django model的get和filter方法的區別
django的get和filter方法是django model常用到的,搞清楚兩者的區別非常重要。
為了說明它們兩者的區別定義2個models
class Student(models.Model):
name = models.CharField('姓名', max_length=20, default='')
age = models.CharField('年齡', max_length=20, default='')
class Book(models.Model):
student = models.ForeignKey(Student)
一.先說下django的get方法:
1django的get方法是從資料庫的取得一個匹配的結果,返回一個對象,如果記錄不存在的話,它會報錯。
比如我資料庫里有一條記錄,記錄的name的值是"Python"的話,我用student = Student.objects.get(name='老王python'),
返回的是一個記錄對象,你可以通過student.__dict__來查看,它返回的是一個字典的形式,{'key':valeus},key是欄位的名稱,而values是值的內容。
而如果我用get方法來查詢一個資料庫里不存在的記錄,程序會報錯。
比如:student = Student.objects.get(name='老王'),你自己可以運行看下。
2如果你用django的get去取得關聯表的數據的話,而關鍵表的數據如果多於2條的話也會報錯。
比如我的student表裡有一個記錄:
id name age
1 python 24
book表:
id student_id
1 1
2 1
我用
student = Student.objects.get(name='python')
book = Book.objects.get(student)
它也會報錯,因為book表有2條記錄和student表相匹配。
二.再說下django filter:
1django的filter方法是從資料庫的取得匹配的結果,返回一個對象列表,如果記錄不存在的話,它會返回[]。
比如我資料庫里有一條記錄,記錄的name的值是Python的話,我用student = Student.objects.filter(name='老王python')
它返回的student是一個對象的列表,可以看的出來student[0]和上面的get方式返回的student的結果是一樣的。
❷ Python3 django 使用model views查詢MySQL數據怎麼寫
from .models import MODEL(class name)
objs = MODEL.objects.get()或者filter()方法。
❸ django中的orm中怎麼對篩選結果去重
版權歸作者所有,任何形式轉載請聯系作者。
作者:petanne(來自豆瓣)
來源:https://www.douban.com/note/301166150/
1.多表連接查詢:感覺django太NX了。
class A(models.Model):
name = models.CharField(u'名稱')
class B(models.Model):
aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')
1.5 反向查詢,補上記錄1.5,感覺django太太太NX了。
class A(models.Model):
name = models.CharField(u'名稱')
class B(models.Model):
aa = models.ForeignKey(A,related_name="FAN")
bb = models.CharField(u'名稱')
查A: A.objects.filter(FAN__bb='XXXX'),都知道related_name的作用,A.FAN.all()是一組以A為外鍵的B實例,可前面這樣的用法是查詢出所有(B.aa=A且B.bb=XXXX)的A實例,然後還可以通過__各種關系查找,很好用!!!
2.條件選取querySet的時候,filter表示=,exclude表示!=。
querySet.distinct() 去重復
__exact 精確等於 like 'aaa'
__iexact 精確等於 忽略大小寫 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小寫 ilike '%aaa%',但是對於sqlite來說,contains的作用效果等同於icontains。
__gt 大於
__gte 大於等於
__lt 小於
__lte 小於等於
__in 存在於一個list范圍內
__startswith 以...開頭
__istartswith 以...開頭 忽略大小寫
__endswith 以...結尾
__iendswith 以...結尾,忽略大小寫
__range 在...范圍內
__year 日期欄位的年份
__month 日期欄位的月份
__day 日期欄位的日
__isnull=True/False