2012-08-06 98 views
1

我遇到了一個複雜的查詢,試圖使用Django的ORM。複雜查詢(django ORM或SQL)

models.py

class Product(models.Model): 
    deprecated = models.ForeignKey(SpecialVersion, null=True) 

class Version(models.Model): 
    compatible_from = models.ForeignKey(SpecialVersion) 
    product = models.ForeignKey(Product) 

class SpecialVersion(models.Model): 
    version = models.ForeignKey(Version, null=True) 
    order = models.IntegerField() 

這樣做的主旨在於,產品有多個版本。其中一些版本是「特殊的」 - 我們通過將SpecialVersion對象指向「特殊」版本對象來跟蹤此情況。當我們創建一個非特殊版本時,它必須指明與SpecialVersion的兼容性。也就是從compatible_from指定的SpecialVersion開始。產品可能會在某個特定版本中被棄用。

現在,我希望能夠找到適當的產品給予一定的SpecialVersion。換句話說,我想獲得所有Product對象,其中有一個SpecialVersion版本在我的給定SpecialVersion下面。此外,產品不推薦使用的SpecialVersion必須爲null,如果不爲null,則必須低於給定的SpecialVersion。

TL; DR: 選擇產品中給定的SpecialVersion位於最低的compatible_from SpecialVersion和棄用的SpecialVersion(如果存在)之間的範圍內的所有產品。

編輯:例子。

商品
ID |已棄用
0 |無
1 | 2

版本
id | prd | compat
0 | 0 | 1
1 | 0 | 2
2 | 1 | 2

SpecialVersions
id | ver | ord
0 |空| 1
1 |空| 2
2 |空| 3
3 |空| 4

與SpecialVersion的兼容性查詢將不返回任何產品,因爲沒有任何產品的版本指定的兼容性如此低。 compat w/SpecialVersion的查詢將返回所有產品,因爲它們都分別具有從SpecialVersion id = 1和id = 2開始的兼容性。最後,與SpecialVersion的compat查詢將僅返回產品id = 0,因爲雖然兩種產品都有足夠低的SpecialVersion compat,但第二種產品已被棄用,用於SpecialVersions及更高版本。

+1

你能提供行,你會基於一個例子請求希望選擇一些虛假的數據和說明了什麼? – Stieffers 2012-08-06 16:30:42

+0

當然。給我一點時間。 – guywhoneedsahand 2012-08-06 16:36:37

+0

我使SpecialVersions有一個空版本字段,因爲那一點沒關係。 – guywhoneedsahand 2012-08-06 16:52:56

回答

0

這裏是我最終使用:

products = Product.objects.annotate(min_version=Min(version_set__compatible_from__order)).filter(min_version__lte = given_special_version).filter(Q(deprecated__isnull = True) | Q(deprecated__order__gt = given_special_version)) 
0

我相信你要找的是Django Q Object。這使您可以在查詢中使用複雜查找,例如「OR」語句。如果我沒有理解你的問題,沿着此線的東西應該只是罰款:

from django.db.models import Q 
models.Product.objects.filter(Q(deprecated__isnull=True) | Q(version__compatible_from__order__lte=GIVENSPECIALVERSION)).all() 

GIVENSPECIALVERSION是版本以便你在你的代碼從別的地方獲得。

+0

關閉,但不完全 - 我需要檢查是否存在棄用(即 - 如果不爲空,則確保我處於棄用版本之下)。此外,沒有版本字段 - 這是一個外鍵,所以你只能得到需要註釋的版本集。請參閱下面的答案。 – guywhoneedsahand 2012-08-07 16:13:43

+0

@guywhoneedsahand啊,gotcha。試圖把我的頭圍繞你的設置。真高興你做到了! – MatthewKremer 2012-08-07 17:00:42

+0

是的,這有點複雜。謝謝。 – guywhoneedsahand 2012-08-07 17:39:44