2011-09-09 7 views
1

특정 항목에 주어진 다수의 다음 및 이전 항목 ID를 취득 또는 매개 변수 : 주어진 항목에 대해장고 : 내 장고 응용 프로그램에서 기본 항목 모델을 가지고

class Item(models.Model): 
    name = models.CharField(max_length=200) 
    brand = models.ForeignKey(User, related_name='items') 
    price = models.CharField(max_length=10) 
    upload_date = models.DateTimeField(auto_now=False, auto_now_add=True) 

, 내가 얻으려고 노력하고 있어요 db의 다음 항목과 이전 항목

은 내가 사용하여이 작업을 수행 할 수 있습니다 알고 장고의 내장 upload_date 필드와 함께 완벽하게 작동하지만 특정 또는 매개 변수 (특정 브랜드를 가지고 또는 예를 들어 항목에 주어진 이전 및 다음 항목을 얻을 필요가 Model.get_next_by_FOO(**kwargs), 특정 가격 이하).

나는 다음과 같은 쿼리를 사용하여 이전 항목을 얻을 수 있습니다 :

previous_item = Item.objects.filter(id__lt=item.id).filter(Q(brand__in=brands)|Q(price__lt=100))[:1] 

내 문제는 다음 항목입니다. 다음 항목에 대해 동일한 쿼리를 실행하면 데이터베이스의 현재 항목 뒤에 오는 항목이 아니라 기준을 충족하는 가장 최근의 항목이 전체적으로 생성됩니다. 이것은 장고가 데이터베이스를 쿼리하는 방식 때문에 발생하는 것으로 알고 있지만 기준을 충족시키는 현재 항목 바로 뒤에 오는 항목을 가져 오는 방법을 알지 못합니다.

여러 개의 OR 매개 변수가있는 특정 항목에 대해 다음 항목을 빠르게 얻을 수있는 방법이 있습니까?

감사합니다.

답변

2

나는 이것을 테스트하지 않았으므로 내 엉덩이를 말하고 있을지 모르지만 시작점 일 수 있습니까?

편집 : 오, 그래, 당신은 "OR"문제에 대해 꽤 분명했지만 여전히 나는 그것을 놓쳤다. 다시 노력하고있어. 기본 개념은 쿼리를 목록으로 변환하고 목록을 병합하는 것입니다. 하지만 지금 생각해보십시오 - 저는 여러분이 실제 쿼리 세트를 직접 만들 수 있다고 생각합니다 -이 경우 유용하지 않을까요? 함수에서 OR의 일반적인 무거운 작업을 수행 한 다음 쿼리에 의해 다시 조작 할 수있는 쿼리 세트를 전달할 수 있습니다.

def get_next(item, brand=None, max_price=None) 
    """Returns the next item to the one provided""" 

    # apply limits to brand/price as specified 
    if brand is not None: 
     brand_candy = Item.objects.filter(brand=brand)\ 
           .values_list('id','update_date') 
    if max_price is not None 
     price_candy = Item.objects.filter(price__lt=max_price)\ 
           .values_list('id','update_date') 

    # arrange all candidates into a joined list 
    # TODO: finish this to merge the lists and sort by update_date 
    ids = brand_candy.join(price_candy) 

    # find the location of the current item in the list 
    # TODO: handle not being there 
    idx = ids.index(item.id) 

    # TODO: handle edges of the list 
    next_idx = idx + 1 

    # pluck out the next item 
    return Item.objects.get(id=ids[next_idx]) 
+0

+1 감사합니다. 존이 작동해야하는 것처럼 들립니다. 사실 next_item 쿼리를 역순으로 정렬하여 문제를 해결했습니다. –

+1

물론. 훌륭한! –

관련 문제