Django ORMの集約関数はクールです。 この状況が、別の=)を追加する理由でした
次に、mysql固有の関数について説明します。
 GROUP_CONCAT
      
       GROUP_CONCAT
      
      と
興味のある機能は、2つのモジュール
django.db.models.aggregates
      
      と
django.db.models.sql.aggregates
      
      ます。 したがって、シーンはmodels.pyです。
django.dbインポートモデルから ##集約関数## django.db.models.aggregatesからimport Aggregate#定義 django.db.models.sql.aggregatesからSQLAggregate#実装としてAggregateをインポート
最も興味深いものから始めましょう-実際の実装です。
 クラスSQLConcat(SQLAggregate):
     sql_function = "GROUP_CONCAT"
    
     def __init __(self、col、separator = '、'、** extra):
         self.sql_template = "%%(関数)s(%%(フィールド)s SEPARATOR '%s')"%セパレーター
         super(SQLConcat、self).__ init __(col、source = models.DecimalField()、** extra) 
      (少なくとも)one
models.DecimalField()
      
      1つあります
models.DecimalField()
      
      を親のコンストラクタに渡すことです。 これは、関数の処理結果が誤って数値型(!)に変換されないようにするために必要です。 このコードは、次にDjangoトランクを更新するかどうかで壊れます。Djangoトランクの次の更新後に表示されます。 あなたは警告されました。
実装の準備ができました。関数の退屈な定義に移りましょう。
 クラスConcat(集合):
     name = "Concat"
    
     def add_to_query(self、query、alias、col、source、is_summary):
        集計= SQLConcat(col、is_summary = is_summary、** self.extra)
         query.aggregates [エイリアス] =集計 
      私たちの仕事が機能することを確認することは残っています:
  >>> Post.threads.aggregate(連結( 'id'))
 {'id__concat': '1,2,3,4'}
 >>> django.dbインポート接続から
 >>> connection.queries
 [{'sql':u "SELECT GROUP_CONCAT(` main_post`.`id` SEPARATOR '、')AS `id__concat` FROM` main_post`"、
   'time': '0.000'}] 
      Habréの最初の投稿、uiii!