2017-08-22 18 views

答えて

0

私はラムダでやったことです:助け ため

usersAge = map(lambda x: calculate_age(x[0]), User_Data.objects.values_list('date_of_birth')) 
    users_age_data_source = [[x, usersAge.count(x)] for x in set(usersAge)] 
    users_age_data_source = sorted(users_age_data_source, key=itemgetter(0)) 
0

これを行うにはいくつかの方法があります。私は最近非常に似た何かをしなければならなかった。この例はPostgresで動作します。

注:以下のコードは構文的に動作し、各ステップ間で記述できるように記述しました。しかし、あなたが望むならば、これらを連鎖させることができます。

まず、 'age'パラメータを取得するためにクエリーセットに注釈を付ける必要があります。

ud = User_Data.objects.annotate(
    age=RawSQL("""(DATE_PART('year', current_date) - DATE_PART('year', "app_userdata"."date_of_birth"))::integer""", []), 
) 

注:それは整数として格納されていない、と毎日変更することができますので、私たちは、データベースの「CURRENT_DATE」関数を使用して誕生フィールドの日付からそれを計算することができますが、「app_userdataを変更する必要がありますあなたのモデルのテーブルと一致する部分。これはモデルの_metaから取り出すことができますが、これはポータブルにするかどうかによって異なります。そうであれば、文字列.format()を使用して、モデルの_metaが提供するものと置き換えます。気にしない場合は、そこにテーブル名を入れてください。

私達はちょうどこのフィールド

ud = ud.values('age') 

でValuesQuerySetを取得し、この時点での年齢

ud = ud.annotate(
    count=Count('age'), 
) 

のカウントでそのクエリセットに注釈を付けるように、今、私たちは「年齢」の値を選びますフィールドとして 'age'と 'count'の両方を持つValuesQuerySetがあります。それは賢明な方法で出てくるようにそれを注文してください..

ud = ud.order_by('age') 

あなたがそれを持っています。

この順序でクエリーセットを構築する必要があります。そうしないと、興味深い結果が得られます。すなわち、カウントの第2のものは最初のものに依存するので、kwargsが定義された順序の概念はないので、クエリーセットがフィールド/依存性のチェックを行うと失敗する。

これが役に立ちます。

Postgresを使用していない場合、変更する必要があるのは、使用しているデータベースエンジンと一致するRawSQL注釈だけです。しかし、そのエンジンは日付の年を取得することができます、どちらかのフィールドから、または "現在の日付"関数に組み込まれています。これを整数として取得することができれば、まったく同じように動作します。ここで

+0

おかげで、私は、ラムダ 'usersAge =マップ(ラムダXと似たようでした:calculate_age(X [0])、User_Data.objectsを(users_age_data_source、key = itemgetter(0)) '(x、usersAge.count(x)、setA(usersAge)内のxに対して) users_age_data_source = – Ahmedn1

関連する問題