PythonのDjangoフレームでデータベースクエリを実現する(QuerySetに戻らない方法)


一、モデルクラスを作成する:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
class Course(models.Model):
 """   """
 name = models.CharField(verbose_name='    ', max_length=255)
 description = models.TextField(verbose_name='      ', null=True)
 price = models.DecimalField(verbose_name=u'    ', max_digits=15, decimal_places=2, default=0.0)
 deleted = models.BooleanField(verbose_name='       ', default=False)
	created_at = models.DateTimeField(auto_now_add=True, db_index=True)
 edited_at = models.DateTimeField(auto_now=True)

 def __repr__(self):
 return self.name

class User(models.Model):
 """   :        """
 name = models.CharField(verbose_name=u'     ', max_length=32, null=True)
 mobile = models.CharField(verbose_name=u'      ', max_length=32, unique=True)
 courses = models.ManyToManyField(verbose_name=u'    ', to='Course', through='UserCourse', related_name='user_course')

class UserExtra(models.Model):
 """       :            """
 birthday = models.CharField(verbose_name=u'  ', max_length=32, null=True)
 email = models.EmailField(verbose_name=u'  ', null=True)
 user = models.OneToOneField(to=User, related_name='extra') #  User        

class UserCourse(models.Model):
 """                """
 course = models.ForeignKey('Course', related_name='my_course')
 user = models.ForeignKey('User', related_name='my_user')

class Coursechapter(models.Model):
 """     """
 name = models.CharField(verbose_name='    ', max_length=255)
 description = models.TextField(verbose_name='      ', null=True)
 course = models.ForeignKey('Course', related_name='course_chapter')
以下のコマンドを実行して、データベースの移動を行います。
python manage.py makemigrations ap_name[アプリケーションの名前]
python manage.py migrate ap_name[アプリケーションの名前]
移転成功後は以下の操作ができますよ。
二、QuerySetに戻らない方法を紹介します。
メソッド名
紹介する
get()
単一オブジェクトを取得
create()
オブジェクトを作成
bulk_create()
一括作成オブジェクト
ゲットするor_create()
クエリーオブジェクトが見つかりませんでした。新しいオブジェクトを作成します。
udate()
一括更新対象
udate_or_create()
オブジェクトを更新します。見つけられなかったら新しいオブジェクトを作成します。
delete()
一括削除対象
ファースト()
最初のオブジェクトを取得
last()
最後のオブジェクトを取得
latest()
一番近いオブジェクトを取得
earliest()
最初のオブジェクトを取得
count()
統計対象の個数
exists()
querysetに対象があるかどうかを判断します。
aggregate()
集約操作
同前bulk()
メインキーのリストから、一括してオブジェクトに戻ります。
iterator()
オブジェクトを含むシーケンサを取得します。
三、以上の方法の使用:
1.get()方法:
クエリーパラメータに従ってマッチングした単一のオブジェクトを返します。マッチングしたオブジェクトの個数が一つだけでないと、MultileObjects Returned異常をトリガします。パラメータによってオブジェクトにマッチしないと、DocesNotExist異常をトリガします。
成功栗:

try:
 user_obj = models.User.objects.get(mobile=13069636688)
 print(user_obj)
except models.User.DoesNotExist:
 print 'User Not Exist'
#     :
User object 
get()法を用いて,異常捕獲を追加するのが望ましい。
パラメータの取得に失敗した栗:

#   get()            
user_obj = models.User.objects.get(mobile=13888888888)
#     :
DoesNotExist: User matching query does not exist.

#   get()        
user_obj = models.User.objects.get(name='  ')
#     :
MultipleObjectsReturned: get() returned more than one User -- it returned 2!
Object DocesNot Existを使用した異常栗:
DoesNot Exist異常はdjango.co re.exceptions.Object DoesNot Existから継承されています。複数のDoes Not Existの位置を特定できます。栗を挙げます。

from django.core.exceptions import ObjectDoesNotExist
try:
 user_obj = models.User.objects.get(mobile=13888888888)
except ObjectDoesNotExist:
 print 'User Not Exist'
#        :
User Not Exist
一般的にget()法のパラメータを使用するのは、クエリーテーブルの中で一意に識別されているフィールドです。
2.create()方法:
create(**kwargs)
ステップでオブジェクトを作成し、保存するのに便利な方法です。
くりを一つあげる:

user_obj = models.User.objects.create(mobile=13045621111, name='  ')
print(user_obj)
#       :
User object
同じイコール:
アメリカ.obj=models.User(mobile=13045621112、name='子牛')
アメリカ.obj.save()
3.bulk_create()メソッド:
bulk_create(objs,batch_size=None)
このような挿入は比較的効率的です。通常は一つのクエリーだけで、いくつかのオブジェクトがあるに関わらず、提供されたオブジェクトリストをデータベースに挿入します。
くりを一つあげる:

course_obj = models.Course.objects.bulk_create(
 [
 models.Course(name='       '),
 models.Course(name='    ')
 ]
)
print course_obj
#       :
[<Course:        >, <Course:     >]
注意:
1.モデルのsave()メソッドを呼び出すことができないので、pre_uは送られません。saveとpost_save信号
2.複数の表の継承中のサブモデルは適用されません。
3.多対多関係には適用されません。
4.get_or_create()メソッド:
ゲットするor_create(defaults=None、**kwargs)
kwargsによってオブジェクトを検索する簡便な方法(モデル内のすべてのフィールドにデフォルト値がある場合、または空とすることができます)があります。このオブジェクトが存在しない場合、新しいオブジェクトを作成します。
この方法は、元のグループのobjectがクエリまたは作成されたオブジェクトであり、createdは新しいオブジェクトを作成するかどうかを示すブール値である。
くりを一つあげる:

try:
 #   id=100        
 course_obj = models.Course.objects.get(pk=100)
except ObjectDoesNotExist:
 #             
 course_obj = models.Course.objects.create(name='      ', price='1877')
get_を使うor_クリアー()方法で書き直した栗:

#      name="      ",      ,       name="      ",price=2000   
obj, created = models.Course.objects\
 .get_or_create(name='      ',
  defaults={'name': '      ', 'price': 2000})

print(obj, created)
#       :
Course object True
注意:
1.何でもget_に伝達する。or_create()のキーワードパラメータは、オプションのdefaultsを除いて、get()メソッドに渡されます。
2.オブジェクトが見つかったら、マッチングを含むオブジェクトを返し、Falseはタプルを構成します。
3.調べた対象が一つ以上であれば、MultipleObjects Returnedは異常です。
4.もし相手が見つからなかったら、get_or_create()は新しいオブジェクトを実装して保存し、新しいオブジェクトとTrueからなるグループを返します。
提案:DjangoビューのPOST要求にのみget_を使用します。or_create()は、修正的な性質を持つ動作なので、GET要求に使うべきではなく、安全ではない。
5.udate()方法:
uudate(**kwargs)
指定したフィールドに対して一括更新を行い、該当する行の数を返します。
くりを一つあげる:

#         ,         
course_row = models.Course.objects.filter(name='    ')\
 .update(name='      ', price=2000)

print(course_row)
#       :
1 #                
注意:
1.udate()方法はsave()操作を必要とせず、唯一の制限は、モデルマスタテーブルの列を更新するだけであり、関連モデル全体ではない。
2.udate()方法は影響を受ける行数を返します。
3.udate()メソッドはまた、ロード対象と呼び出しsave()との間の短い時間でデータベースの一部の内容が変更される可能性がある競争条件を防止することができます。
対象を更新するだけで、対象のために他のことをする必要はなく、もっとも効果的な方法は、モデルオブジェクトをメモリにロードするのではなく、udateを呼び出すことです。

#         :
course_obj = models.Course.objects.get(name='    ')
course_obj.name = '    '
course_obj.save()
6.uudate_or_create()メソッド:
udate_or_create(defaults=None、**kwargs)
与えられたkwargsを通じて、対象を更新するのに便利な方法です。もし対象が見つからなかったら、新しいオブジェクトを作成します。
defaultsは、オブジェクトを更新するために、field、valueペアからなる辞書です。defaultsの値は、呼び出し可能なオブジェクトであってもよい。
この方法は、元のグループのobjectが作成されたオブジェクトまたは更新されたオブジェクトであり、createdは新しいオブジェクトが作成されたかどうかを示すブール値である(true(作成成功を示す)。
くりを一つあげる:

try:
 #     name="    "  ,      name   "    "    
 course_obj = models.Course.objects.get(name='    ')
 course_obj.name = '    '
 course_obj.save()
except ObjectDoesNotExist:
 #      ,      name="    "   
 course_obj = models.Course.objects.create(name='    ')
udate_を使うor_create()メソッドを書き換えます。

#     name="    "    ,     , name price      ,           
obj, res = models.Course.objects\
 .update_or_create(name='    ',
  defaults={'name': '    ', 'price': 2080})

print(obj, res)
#     :
Course object False #           ,          

Course object True #          
7.delete()方法:delete()QuerySetのすべてのオブジェクトを一括して削除し、削除したオブジェクトの個数と各オブジェクトの種類の削除回数の辞書を返します。
delete()動作は直ちに実行されます。
くりを一つあげる:

#     price=2080     
cur_course =models.Course.objects.filter(price=2080).delete()
print(cur_course)

#     :
(7, {u'apps.Coursechapter': 2, u'apps.Course': 2, u'apps.UserCourse': 3})
#       , 7     7   , Coursechapter  2   , Course  2   , UserCourse  3   
注意:delete()は、削除されたすべてのオブジェクト(カスケード削除、オブジェクトの外キー、マルチペアの関係を含む)にpre_uを発行します。deleteとpost_delete信号
8.first()方法:first()結果セットの最初のオブジェクトを返します。見つけられなかったら、Noneに戻ります。QuerySetに順序が設定されていない場合は、自動的にキーを押して並べ替えます。
くりを一つあげる:

#                 
course_obj = models.Course.objects.all().first()
print(course_obj)
#       :
Course object #            

#     name='    '      
course_obj = models.Course.objects.filter(name='    ').first()
print(course_obj)
#     :
None #         name='    '
[0]を使って最初のオブジェクトを取得します。

course_obj = models.Course.objects.filter(name='    ')[0]
print(course_obj)
#     :
IndexError: list index out of range #     ,         None

#     [0]  ,        
try:
 course_obj = models.Course.objects.filter(name='    ')[0]
except IndexError:
 course_obj = None
9.last()方法:last()first()方法と同じですが、検索セットの最後のオブジェクトだけが返ってきます。
くりを一つあげる:

#             
course_obj = models.Course.objects.last()
print(course_obj)
#     :
Course object
10.latest()方法:
latest(field_)name=None)
日付辞典field_を使うnameは、日付で最新のオブジェクトに戻ります。
くりを一つあげる:

#                 
course_obj = models.Course.objects.filter(created_at__isnull=False).latest('created_at')
print(course_obj.id)
#     :
101 #       Course  ID,       ,           。
注意:earliest()とlatest()は、空の日付の例を返します。空の値をフィルタする必要があるかもしれません。
11.earliest()方法:
アリストname=None)
latest()方法と同じですが、クエリー集中は日付別の一番早い対象に戻ります。
くりを一つあげる:

#                   
course_obj = models.Course.objects.filter(created_at__isnull=False).earliest('created_at')
print(course_obj.id)
#     :
1 #   Course   ID,          ,       
12.count()方法:count()データベースに対応するQuerySetオブジェクトの個数を返します。
くりを一つあげる:

course_count = models.Course.objects.all().count()
print(course_count)
#     :
count()は永遠に異常を起こしません。
13.exists()方法:exists()QuerySetが何らかの結果を含むなら、Trueに戻ります。そうでないとFalseに戻ります。
くりを一つあげる:

#           name="         "
course_list = models.Course.objects.filter(name='      ')
#        "  "
if course_list.exists():
 print('  ')
#     :
  
このexists()方法は以下のクリより速いです。

#            name="      "
course_list = models.Course.objects.filter(name='      ')
if course_list:
 print('  ')
#     :
  
14.aggregate()方法:
aggregate(args,*kwargs)
集計値の辞書(平均値、総和など)を返し、QuerySetで計算します。各パラメータは、返す辞書に含まれる値を指定します。
くりを一つあげる:
匿名パラメータの名前は、集計関数の名前とモデルフィールドに基づいて生成されます。

from django.db.models import Count

#       name="      ", "name"        
course_dict = models.Course.objects.filter(name="      ").aggregate(Count('name'))
print(course_dict)
#     :
{u'name__count': 3} #           (count)     (name)   
栗をもう一つ挙げます
キーワードパラメータを使用して、集計関数を指定します。戻り値の集約値の名前を制御できます。

from django.db.models import Count

#       name="      ",  name        
course_dict = models.Course.objects.filter(name="      ")\
 .aggregate(customize_name=Count('name'))
print(course_dict)
#     :
{'customize_name': 3} #              ,        
15 in_ブロック()方法:
同前bulk(id_)リスト=None)
マスターキーのリストを取得し、指定されたIDのオブジェクトに各キー値をマッピングする例の辞書を返します。リストが提供されていない場合は、クエリーセットのすべてのオブジェクトに戻ります。
くりを一つあげる:

#       ID 1   
course_obj = models.Course.objects.in_bulk([1])
print(course_obj)
#     :
{1: <Course: Course object>}

#       ID 2,3   
course_obj = models.Course.objects.in_bulk([2, 3])
print(course_obj)
#     :
{2: <Course: Course object>, 3: <Course: Course object>}

#         ID,      
course_obj = models.Course.objects.in_bulk([])
print(course_obj)
#     :
{}

#         ID     ,       
course_obj = models.Course.objects.in_bulk()
print(course_obj)
#     :
{1: <Course: Course object>, 2: <Course: Course object>, 3: <Course: Course object>, 4: <Course: Course object>, 5: <Course: Course object>, 6: <Course: Course object>,
16.iterator()方法:iterator()データベース操作を提出して、QuerySetを取得して、1つのローズマリーを返します。
QuerySetは通常、その結果を内部にキャッシュし、再計算を繰り返すと追加のクエリにつながりません。
主にQuerySetのキャッシュメカニズムは、データベースから多くのデータを取り出すと、プログラムが崩壊する恐れがあります。
くりを一つあげる:

#           ,    cache  ,        ,       
course_list = models.Course.objects.all()

#   iterator()  ,       2 for  ,    for  ,        
course_set = models.Course.objects.all().iterator()
print(next(course_set))
print(next(course_set))
print(next(course_set))

#         ,       ,           
models.Course.objects.filter(pk=1).update(price=66)


#   for  2 ,   2   ,       sql  ,    sql    ,
#               ,        
for obj in course_list:
 print(obj.name, obj.price)

"""
#       
id:1
name:       
price: 2000
#      
id:1 
name:       
price : 66
"""
iteratorを使うと、以前のprefetch_を招きます。related()の呼び出しは無視されています。この二つが一緒に最適化するのは意味がないからです。
以上のPythonのDjangoのフレームワークは、データベースクエリ(QuerySetに戻らない方法)を実現します。小編集が皆さんに共有している内容のすべてです。参考にしていただければと思います。どうぞよろしくお願いします。