2012-03-18 2 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 выше, чем любая более ранняя дата.Query Модель Django, основанная на взаимосвязи между вспомогательными элементами ForeignKey

Спасибо, Боффины.

ответ

1

Как сказал Марцин в другом ответе, вы можете развернуть отношения, используя двойной синтаксис подчеркивания. Тем не менее, вы также можете их связывать, и иногда это может быть легче понять логически, хотя это приводит к появлению большего количества строк кода. В вашем случае, хотя, я мог бы сделать что-то, что будет выглядеть следующим образом:

первых вы хотите узнать цену на дату х:

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) 

Знайте, что срез попадет в базу данных самостоятельно и вернет объект. Таким образом, этот запрос попадет в базу данных три раза за вызов функции, один раз для подсчета, один раз для среза и один раз для фактического запроса. Вы можете отказаться от счета и среза, выполнив совокупную функцию (например, среднее значение по всем возвращенным строкам за день), но они могут стать дорогими по своему усмотрению.

для получения дополнительной информации см QuerySet API:

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

0

Вы можете выполнить запрос, который охватывает отношения, используя следующий синтаксис:

Product.objects.filter(price_history__price = 3) 

Однако, я не уверен, что это возможно, чтобы выполнить запрос, который вы хотите эффективно в чистом Джанго запросе.