2010-07-01 17 views
3

我有一個定義時間槽的Django模型。每個時隙可以容納一定數量的用戶(TimeSlot.spots)。每個時隙也有一定的數量就已經舉行的用戶(一個多對多的領域,TimeSlot.participantsDjango註解的數學運算

當我傳給顯示可用時隙給用戶的模板,我批註與TimeSlot.objects.annotate(Count('participants')),這給數用戶目前由時隙舉行participants__count

不過,我真正想要的是剩餘容量(TimeSlot.spots)減去目前持有(participants__count)的數量斑點的數目。我怎樣才能註釋另一個領域這一新號碼,所以我可以將它傳遞給模板?

+0

[減去2分註釋列]的可能重複(http://stackoverflow.com/questions/17374467/減去兩個註釋列) – Louis 2014-10-28 10:38:11

回答

1

不可能只有一個註釋。我會在模型上創建一個註解的方法,然後從您的TimeSlot.spots值中減去該方法。這將使用更多的數據庫查詢,但那是您唯一的選擇。或者我想你可以下降到原始SQL ...

+0

謝謝,我擔心可能是這樣。我認爲我最終要做的就是在'TimeSlot.participants'上設置ManyToManyManager,這樣每當它添加一個人時,它就會減少'TimeSlot.spots',這從長遠來看有點不那麼優雅,但肯定更便宜。 – stillinbeta 2010-07-01 15:10:11

2

它仍然不可能與註釋(雖然它計劃在Django中實現)。但是,您可以使用.extra()查詢來完成此操作。有關詳細信息,請參閱我的answer另一個問題。

UPD:

從本質上講,你需要somethig這樣的查詢:

items = MyModel.objects.extra(
    select = {'variance': 'Model.someField - SUM(relatedModel__someField)'}, 
)