2012-03-18 108 views
1
class Price(models.Model): 
    date = models.DateField() 
    price = models.DecimalField(max_digits=6, decimal_places=2) 
    product = models.ForeignKey("Product") 

class Product(models.Model): 
    name = models.CharField(max_length=256) 
    price_history = models.ManyToManyField(Price, related_name="product_price", blank=True) 

我想查詢產品,以便僅返回那些日期x的價格高於任何較早日期的產品。根據ForeignKey子元素之間的關係查詢Django模型

謝謝boffins。

回答

1

正如Marcin在另一個答案中所說的,您可以使用雙下劃線語法向下鑽取關係。但是,您也可以鏈接它們,有時這可以更容易理解,即使它導致更多的代碼行。在你的情況雖然,我可能會做一些事情,看起來這樣的:

首先你要知道日期X價格:

a = Product.objects.filter(price_history__date = somedate_x) 

你也許應該測試一下,看看是否有每日起超過:

if a.count() == 1: 
    pass 
else: 
    do something else here 

(或類似的東西)

現在你有你的價格,你知道你的約會,所以才這樣做:

b = Product.objects.filter(price_history__date__lt = somedate, price_history__price__gt=a[0].price) 

知道切片將自己命中數據庫並返回一個對象。所以這個查詢將每個函數調用三次,數據一次,切片一次,實際查詢一次。您可以通過執行集合函數(比如一天中所有返回行的平均值)來放棄計數和切片,但這些可能會因爲它們本身的成本而變得昂貴。

瞭解更多信息,請參閱查詢集API:

https://docs.djangoproject.com/en/dev/ref/models/querysets/

0

您可以執行跨使用此語法關係的查詢:

Product.objects.filter(price_history__price = 3) 

但是,我不知道它是可以執行你在純Django的查詢效率地想要查詢。