2012-03-18 174 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的查询效率地想要查询。