2012-03-18 1 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 하위 요소 간의 관계를 기반으로 장고 모델을 쿼리합니다.

감사 인사.

답변

1

다른 답변에서 Marcin이 말했듯이 두 배 밑줄 구문을 사용하여 관계를 상세하게 드릴 다운 할 수 있습니다. 그러나 코드를 체인화 할 수도 있고 코드 라인이 많아 지더라도 논리적으로 이해하기가 더 쉬울 수도 있습니다.

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

당신은 아마 날짜 당 하나 이상이 있는지 확인하기 위해 테스트해야합니다 : 당신이 날짜 X에 가격을 알고 싶은 첫번째

:하지만 귀하의 경우,이 보일 것입니다 뭔가를 할 수 :

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

(또는 같은)

지금 당신은 당신의 가격을 가지고 있고, 그래서 그냥 이렇게, 당신의 날짜를 알고

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

슬라이스가 자체적으로 데이터베이스에 도달하여 객체를 반환한다는 사실을 알고 있어야합니다. 따라서이 쿼리는 함수 호출 당 데이터베이스에 세 번, 한 번은 카운트에, 한 번은 슬라이스에, 한 번은 실제 쿼리에 대해 조회합니다. 집계 함수 (하루에 반환되는 모든 행의 평균과 같음)를 수행하여 개수와 조각을 포기할 수는 있지만 그 자체로 값이 비쌀 수 있습니다.

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

: 자세한 내용은

은 검색어 세트 API를 참조

0

당신이 구문을 사용하여 관계를 걸쳐 쿼리를 수행 할 수 있습니다 그러나

Product.objects.filter(price_history__price = 3) 

을, 나는 당신이 순수 장고 쿼리에 효율적으로 원하는 쿼리를 수행 할 수 있다는 모르겠어요.

관련 문제