Djangoのモデル単一テーブルのクエリ

データベースからのクエリは、通常のコレクションの結果であり、このコレクションは、クエリセットと呼ばれています

  1. ビューSQL Djangoのクエリセットを実行します

.query。STR()または印刷実行SQL文の.query性質

from quicktool.models import User
from django.http import HttpResponse
Creat = User.objects.all().filter(created=1557222940).query.__str__()
return HttpResponse(str(Creat))
#输出结果:SELECT `user`.`表字段1`, `user`.`表所有字段`, FROM `user` WHERE `user`.`created` = 1557222940
复制代码
  1. Djangoのmanage.pyシェルモードの提供

Djangoはシェルモードに実行のpython manage.pyシェルディレクトリにmanage.pyの

C:\Users\admin>d:
D:\>cd D:\django_test\mytestsite
D:\django_test\mytestsite>python manage.py shell
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
复制代码
  1. 値()(辞書とvalues_listを返します)タプルを返します。
  • 3.1共通オブジェクト・モデル

シェルの印刷結果とコモンモードモデルオブジェクト---

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162)
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [<User: User object (63)>]>
复制代码

通常のモデルオブジェクト---ビューのURLと結果を示します

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162)
    return HttpResponse(TodayCreat)
# 浏览器展示结果:User object (63)
复制代码
  • 3.2値()

値()ValuesQuerySet(クエリセットサブクラス)を返し、オブジェクトの各インスタンスの代わりに、モデルの辞書返す反復は、オブジェクトのキー属性のモデル名に対応する、オブジェクトディクショナリを表します

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values()
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [{'id':63, 'name':'xili','sex':'男'}]>
复制代码

値()ビューのURLとの結果を示し---辞書を返します。

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values()
    return HttpResponse(TodayCreat)
# 浏览器展示结果:{'id':63, 'name':'xili','sex':'男'}
复制代码

フィルタをフィールドを指定する値(*フィールド)は、唯一の辞書リターンキーと指定したフィールドの値が含まれます

フィールドが指定されていない場合は、各辞書はキーを備え、データテーブル内のすべてのフィールドの値を返します。

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values('id','name')
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [{'id': 63, 'name': 'xili'}]>
复制代码

値(*フィールド)ビューのURLとの結果を示し---辞書を返します。

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values('id','name')
    return HttpResponse(TodayCreat)
# 浏览器展示结果:{'id':63, 'name':'xili'}
复制代码
  • 3.3 values_list()

values_list()はむしろ辞書より、タプル反復を返します

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values_list()
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [(63, 'xili','男')]>
复制代码

values_listは()ビューのURLとの結果を示し---タプルを返します。

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values()
    return HttpResponse(TodayCreat)
# 浏览器展示结果:(63,'xili','男')
复制代码

濾過フィールドvalues_list(*フィールド)を指定するが、指定されたキーフィールドの値のみを含むタプルを返され

フィールドが指定されていない場合は、各タプルキーと返される値は、データテーブル内のすべてのフィールドが含まれています

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values_list('id','name')
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet [(63, 'xili')]>
复制代码

URLを示すvalues_list(*フィールド)、パラメータフィールドを渡す平坦でないパスパラメータ、タプルとの結果を返す---図

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values('id','name')
    return HttpResponse(TodayCreat)
# 浏览器展示结果:(63,'xili')
复制代码

values_list(*フィールド)、*フィールドだけ一つのフィールドが送信される場合、平坦なパラメータを渡すことができるがTrueであり、それは結果ではなくタプルよりも、単一の値を返し表します。

>>> from quicktool.models import User
>>> TodayCreat = User.objects.filter(created=1488356162).values_list('name',flat=True)
>>> print(type(TodayCreat))
<class 'django.db.models.query.QuerySet'>
>>> print(TodayCreat)
<QuerySet ['xili']>
复制代码

values_list(*フィールド)の両方のパスパラメータは、それらがビューURLを用いた結果を示し---フラットフィールドパラメータを渡すとタプルを返します

from quicktool.models import User
from django.http import HttpResponse
def TodayCreat(request):
    TodayCreat = User.objects.filter(created=1488356162).values('name',flat=True)
    return HttpResponse(TodayCreat)
# 浏览器展示结果:xili
复制代码

注:複数のフィールドは、エラーが平らに送信される場合values_list(*フィールド)は、*フィールドが渡されました

TypeError: 'flat' is not valid when values_list is called with more than one field.
复制代码

values_list値と結果の型の違いを返します。

  • vlaues -

単一のレコード - <クラスの辞書 '>

複数のレコード - <クラスのdjango.db.models.query.QuerySet '>

  • vlaues_list -

単一のレコード - <クラスのタプル '>

複数のレコード - <クラスのdjango.db.models.query.QuerySet '>

  1. オブジェクトのメソッドを取得します。
# all():查询所有结果
Person.objects.all() # 查询所有的Person条目
Person.objects.all()[:10] #切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引

# get(**kwargs):返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
Person.objects.get(name="xili") # 名称为 xili 的一条,多条会报错

# filter(**kwargs):返回与所给筛选条件相匹配的对象
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
Person.objects .filter(creat__gt=1488356162) # creat时间大于某个时间戳
Person.objects .filter(creat__gte=1488356162) # creat时间大于等于某个时间戳
Person.objects .filter(creat__lt=1488356162) # creat时间小于某个时间戳
Person.objects .filter(creat__lte=1488356162) # creat时间小于等于某个时间戳
Person.objects .filter(creat__range=(start_time, end_time)) # creat时间在start_time和end_time范围内

# exclude(**kwargs):返回与所给筛选条件不匹配的对象
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
复制代码
  1. ORDER_BYは():クエリは、昇順または降順にソート結果
# order_by('-id')倒序,order_by('id')升序
# 元组升降序
User.objects.filter(Class_id=5).values_list('id').order_by('-id')
打印结果:(167,)(158,)(144,)(142,)(141,)(140,)(139,)(138,)(137,)(136,)(135,)(118,)(68,)
User.objects.filter(Class_id=5).values_list('id').order_by('id')
打印结果:(68,)(118,)(135,)(136,)(137,)(138,)(139,)(140,)(141,)(142,)(144,)(158,)(167,)
# 字典也能升降序
User.objects.filter(Class_id=5).values('id').order_by('id')
打印结果:{'id': 68}{'id': 118}{'id': 135}{'id': 136}{'id': 137}{'id': 138}{'id': 139}{'id': 140}{'id': 141}{'id': 142}{'id': 144}{'id': 158}{'id': 167}
复制代码
  1. クエリセットは、負のインデックスをサポートし①reverse()しません:降順:ソートクエリ結果②order_byを()リバース
Person.objects.all()[:10] #切片操作,前10条
Person.objects.all()[-10:] #会报错!提示Negative indexing is not supported.
 
# 1. 使用 reverse() 解决
Person.objects.all().reverse()[:2] # 最后两条
Person.objects.all().reverse()[0] # 最后一条
 
# 2. 使用 order_by() 解决
Author.objects.order_by('-id')[:20] # id最大的20条
复制代码
  1. クエリセットチェーン・サポート・クエリ
Plan.objects.all().filter(status=3).filter(created__lte=1557331200).filter(finished__gte=1557417599)
User.objects.all().values('created').annotate(count=Count('created')).values('created','count')
Person.objects.filter(name__contains="abc").exclude(age=23)
复制代码
  1. 重複排除

①明確な():重複レコードから除外した結果を返します。

qs1 = Pathway.objects.filter(label__name='x')
qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
qs3 = Pathway.objects.filter(inputer__name='xili')

# 合并到一起
qs = qs1 | qs2 | qs3
这个时候就有可能出现重复的
 
# 去重方法
qs = qs.distinct()
复制代码

②設定():Pythonの組み込み関数は、非繰り返しの順不同のコレクションを作成するには

select_UserID = Pathway.objects.filter(inputer__name='xili')
set(select_UserID)
复制代码
  1. リスト():リストへの変更を強制するクエリセット
select_UserID = Pathway.objects.filter(inputer__name='xili')
list(select_UserID)
#结果打印[(532,), (671,), (797,), (532,)]
#原先未转变前打印((532,), (671,), (797,), (532,))
复制代码
  1. 統計の数

①数は():のクエリ(クエリセット)と一致するデータベース内のオブジェクトの数を返します。

User.objects.all().filter(created__range=(today_start_time, today_end_time)).count()
复制代码

②LEN():タプル、辞書やリスト要素の統計情報の数

select_UserID = Pathway.objects.filter(inputer__name='xili')
len(select_UserID)
复制代码
  1. 最初の():最初のレコードを返し、最後の():最後のレコードを返します
Pathway.objects.filter(inputer__name='xili').first()
Pathway.objects.filter(inputer__name='xili').last()
复制代码
  1. ()が存在する:クエリセットにデータが含まれている場合、そうでなければFalse、Trueを返します
from quicktool.models import User
from django.http import HttpResponse
TodayCreat = User.objects.all().filter(created__range=(today_start_time, today_end_time)).exists()
return HttpResponse(count_TodayCreat)
#能查询出数据则结果为True,不能查询出数据则返回False
复制代码
  1. クエリセットは反復可能です
es = Entry.objects.all()
for e in es:
    print(e.headline)
复制代码

ます。https://juejin.im/post/5cf8c6b151882574ce01387eで再現

おすすめ

転載: blog.csdn.net/weixin_33978044/article/details/91416430