2

私はしばらくの間、ここに潜んで学んでいます。今、どういうわけか簡単な解決策が見えないという問題があります。ジャンゴを学ぶために、基本的に予約済みのアイテムを追跡するアプリを作成しています。私がやりたいことは、選択した年 1 のアイテムが 1 か月あたり何日予約されたかを示すことです。

私は次のモデルを持っています:

Asset(Model)

BookedAsset(Model):
 asset = models.ForeignKey(Asset)
 startdate = models.DateField()
 enddate = models.DateField()

したがって、次のエントリがあります。

asset 1, 2010-02-11, 2010-02-13
asset 2, 2010-03-12, 2010-03-14
asset 1, 2010-04-30, 2010-05-01

私は次のものを返してもらいたいです:

asset 1    asset 2
-------    -------
Jan = 0    Jan = 0
Feb = 2    Feb = 0
Mar = 0    Mar = 2
Apr = 1    Apr = 0
May = 1    May = 0
Jun = 0    Jun = 0
Jul = 0    Jul = 0
Aug = 0    Aug = 0
Sep = 0    Sep = 0
Oct = 0    Oct = 0
Nov = 0    Nov = 0
Dec = 0    Dec = 0

最初に日付範囲内の日数を取得する必要があることを知っています (そして、それらが当月から翌月に入った場合は追跡します)。次に、日数を集計します。Djangoでエレガントに行う方法にこだわっています。

どんな助け(または正しい方向へのヒント)も大歓迎です。

4

4 に答える 4

0

データベースビューを介してそれを行い、メタクラスオプション managed = False を使用してそのビューを django モデルにマッピングする別のソリューションがあります

詳細な説明はこちら: http://anthony-tresontani.github.com/Django/2012/09/12/wka-django-orm-limitations/

于 2012-09-21T05:34:58.867 に答える
0

私は上記のどちらの答えにも行きません (カスタム SQL を作成するのは好きですが、少なくとも 5 年間は行っていません)。モデルはリレーショナル パラダイムで実行できるほど単純です。

あなたが探している答えは、django の集約機能の annotate() 関数です : http://docs.djangoproject.com/en/dev/topics/db/aggregation/クエリセットのドキュメントで説明されている日付の月: http://docs.djangoproject.com/en/dev/ref/models/querysets/#month

1 つのアセットに対して取得する大まかな例:

BookedAsset.objects.filter(asset=asset).annotate(month_count=Count('startdate__month')).order_by('startdate__month')

(明らかに間違っていますが、あなたの構造を再作成して正確に正しいステートメントを提供し、少しいじってドキュメントを読むことはできませんでした)

おそらく、同じドキュメントで結合構文を使用して、すべてのアセットを一度に処理できます。

于 2010-07-24T14:30:20.727 に答える
0

あなたが持っているモデル構造でそれを行う方法は考えられません。

これはかなり複雑な要件ですが、それを解決するにはおそらくかなりの量のカスタム SQL が必要になるでしょう。BookedAssetDay最初は、予約のために毎日を個別に表すテーブルを持つように、構造を変更することを検討する必要があるかもしれません。

class BookedAsset(models.Model):
    asset = models.ForeignKey(Asset)
    day = models.DateField()

次に、クエリは次のようになります。

BookedAsset.objects.extra(
    select={'month': 'MONTH(day)'}
).values('asset', 'month').annotate(Count('bookedasset__month'))
于 2010-05-23T15:53:30.340 に答える
0

最後に、質問の解決策としてカスタム クエリを使用しました。

cursor = connection.cursor()
cursor.execute("""select to_char(allmonths.yeardate::date, 'YYYY/MM/DD') as monthdate,
                    COUNT("day") as bookings
                    from (
                    select distinct date_trunc('month', (date %s - offs)) as yeardate 
                    from generate_series(0,365,28) as offs
                    ) as allmonths
                    left join bookings_bookedassetday 
                    on EXTRACT(MONTH from "day")=EXTRACT(MONTH from yeardate) 
                    and asset_id=%s and EXTRACT(YEAR from "day") = %s
                    group by allmonths.yeardate
                    order by allmonths.yeardate asc""", [year+'-12-31', id, year])

query = cursor.fetchall()

多分それはそれを行う最もジャンゴ主義的な方法ではありませんが、純粋なジャンゴでそれを理解するよりもはるかに簡単であることがわかりました:|

他の誰かがより良い代替手段を持っている場合、私はすべて耳にします:)

于 2010-05-30T17:12:54.643 に答える