django querysetの加算とチュートリアルの選別


1、集合加算

a = {1,2,3}
b = {3,4,5}
print(type(a))
print(a|b)
2、queryset条件に合うふるい順
project=Project_models.object.filter.order_by('id')
project=projects.filter(bad_)numbers_gt=0).order_by('bad_numbers
知識を補充します:djangoの中で重合してaggregateとannotate GROUT BYの使用方法
djangoに接触するのはもう長い時間ですが、QuerySetの照会集を使う方式はずっと低いです。filter/Q関数/excludeなどを使って調べます。データ量が小さい時はいいですが、データ量が多くて、検索が複雑なら、やはり複数のfilterを使って検索するのは効率が低いです。清明節の休みの間に、会社に来て私生活をします。この文書に出力します。まず印象を深めて熟練度を高めることです。二つ目は分かち合い、皆さんに幸福をもたらします。
クエリーデータベースの効率を向上させるスキームは2つあります。
第一に、オリジナルのSQL文を使って照会するという利点は、開発者の意図通りに実行できるという点であり、効率が高いという点ですが、欠点も明らかです。
1.開発者はSQL文をよく知っていて、開発者の仕事量を増やす必要があります。また、SQLを交えたプロジェクトは今後のプログラムの維持にも役立ちません。プログラムの結合度を大きくします。
2.検索条件がダイナミックに変化すると、開発がより難しくなります。
djangoはこの難問を解決するために、aggregate(集計関数)とannotate(aggregateに基づいてGROUTP BY操作を行う)を提供します。
次に、第二の方法を紹介します。
一.aggregateの使い方
今日は同僚の指導のもとで、djangoのannotateの使い方をよく見て、検索条件によってSQL文を動的に生成して、グループクエリの効率を高めます。
aggregateを理解する鍵はSQLにおける重合関数を理解することにある。以下は百科事典から摘出する。SQL基本関数、集合関数は値のセットを計算し、単一の値を返す。COUNT以外は、集計関数は空の値を無視します。一般的な重合関数はAVG/COUNT/MAX/MIN/SUMなどがあります。
aggregateはdjangoで重合関数を実現するものです。まず、aggregateの使用シーンを見てください。プロジェクトの中では、データベースからまとめたセットを取り出すことがあります。django公式の例を使用します。

from django.db import models

class Author(models.Model):
  name = models.CharField(max_length=100)
  age = models.IntegerField()

class Publisher(models.Model):
  name = models.CharField(max_length=300)
  num_awards = models.IntegerField()

class Book(models.Model):
  name = models.CharField(max_length=300)
  pages = models.IntegerField()
  price = models.DecimalField(max_digits=10, decimal_places=2)
  rating = models.FloatField()
  authors = models.ManyToManyField(Author)
  publisher = models.ForeignKey(Publisher)
  pubdate = models.DateField()

class Store(models.Model):
  name = models.CharField(max_length=300)
  books = models.ManyToManyField(Book)
  registered_users = models.PositiveIntegerField()

もし私たちがaggregateを使ってカウントすると:

>>> from django.db.models import Count
>>> pubs = Publisher.objects.aggregate(num_books=Count('book'))
>>> pubs
{'num_books': 27}
そして、aggregateは単に和を求めるだけでなく、平均Avg、最大最小などを求めることができます。

>>> from django.db.models import Avg
>>> Book.objects.all().aggregate(Avg('price'))
{'price__avg': 34.35}



# Cost per page            ,  price_per_page
>>> from django.db.models import F, FloatField, Sum
>>> Book.objects.all().aggregate(
... price_per_page=Sum(F('price')/F('pages'), output_field=FloatField()))
{'price_per_page': 0.4470664529184653}
上記の説明により、aggregateの論理は比較的簡単で、アプリケーションシーンが狭いことが分かります。データをグループ化してから集約する操作をするなら、annotateを使って実現します。
二.annotateの使い方
まず、このようなmodelsがあると仮定します。

# python:2.7.9
# django:1.7.8

class MessageTab(models.Model):
  msg_sn = models.CharField(max_lenth=20, verbose_name=u'  ')
  msg_name = models.CharField(max_length=50, verbose_name=u'    ')
  message_time = models.DateTimeField(verbose_name=u'      ')
  msg_status = models.CharField(max_length=50, default='   ', verbose_name=u'    ')
  class Meta:
    db_table = 'message_tab'
開発過程において、各メッセージの状態の数を調べる必要がある。私たちはよくfilter(…).count(・・)を使って調べます。今は使えます。
msgS=Message Tab.objects.values_リスト('msg_status.annotate(Count('id')
ここで、IDはデータベースから自動的に生成される自己増加フィールドである。values_listの使い方はGoogle、もしくはprintで見てください。
データベースが実際に実行しているコードは、
print msgS.query
プリントアウトします。見られます
SELECT`message_tab`.msg_status`,COUNT(`message_)tab`.id`)AS`id_ucount`FROM`message_tab`GROUT BY`message_tab`.msg_status`ORDER BY NULL
直観明瞭である。msg_を通るstatusでグループbyを行います。カスタムidu__u_を望むならcount、たとえばmsg_に指定します。numは、使用できます。annotate(msg_)num=Count(‘id’)
複数のクエリ条件が存在する場合、例えば、最近7日間の間に、メッセージを検索する。nameがあるグループ内のメッセージに属する場合は、Q関数を使用することができる。

date_end = now().date() + timedelta(days=1)
date_start = date_end - timedelta(days=7)
messageTimeRange = (date_start, date_end)
GroupList = getGroupIdLis(request.user) #           group     。。     
qQueryList = [Q(message_time__range=messageTimeRange), Q(message_name__in=GroupList)] #      Q      

msgS = MessageTab.objects.filter(reduce(operator.and_, qQueryList)).values_list('msg_status').annotate(msg_num=Count('id'))
print msgS.queryを再起動するとSQL文が見られます。

SELECT `message_tab`.`msg_status`, COUNT(`message_tab`.`id`) AS `msg_num` FROM `message_tab` WHERE (`message_tab`.`message_time` BETWEEN 2017-03-27 00:00:00 AND 2017-04-03 00:00:00 AND `message_tab`.`message_name` IN (1785785, 78757, 285889, 2727333, 7272957, 786767)) GROUP BY
 `message_tab`.`msg_status` ORDER BY NULL
完璧ですか?
以上のdjango querysetは合計してと教程をふるい分けます。小編纂は皆さんに全部の内容を共有しました。参考にしてもらいたいです。皆さんもよろしくお願いします。