2009-11-17 4 views
1

아약스 및 일반 HTTP 요청에 모두 응답하려는 간단한보기가 있습니다. 간체, 그것은 다음과 같습니다select_related() 및 Ajax (Django)가 포함 된 여러 필드가 많습니다.

def tag_search(request, tag): 

    items = Item.objects.filter(tags__tagname__exact=tag) 

    if request.is_ajax(): 

     return HttpResponse(serializers.serialize('json', items), mimetype='application/json') 

    else: 

     return render_to_response('mytemplate.html', locals()) 

문제가 많은 관계로 많은 값을 반환하지 않습니다이다 - 같은 기본 키의 단지 목록 :

[1, 2, 5] 

이해를 select_related()를 사용하여 많은 관계를 유지할 수는 없습니다. 그 정보를 다시 전달하는 모범 사례를 제공 할 수 있습니까?

답변

1

당신은

item_ids = [1, 2, 5] 
Item.objects.in_bulk(item_ids) 

# Another option: 
Item.objects.filter(id__in=item_ids) 

bulk select using those ids (아마 가장 쉬운 솔루션)을 수행 할 수 있습니다은 편집 : 내 충고는 이것을 처리하는 django-tagging 중 하나를 사용하는 것입니다. 또는 그냥 내 프로젝트에 직렬화를 할 some code를 작성했습니다

from django.core.cache import cache 

class Item(models.Model): 
    ... 

    def get_tags(self): 
     cache_key = "item_%s_tags" % self.id 
     cache_timeout = 600 # 10 minutes or whatever 

     tags = cache.get(cache_key, False) 
     if not tags: 
      tags = self.tags.all() 
      cache.set(cache_key, tags, cache_timeout) 

     return tags 
+0

감사합니다. 흥미로운 아이디어이지만 직렬화를 위해 관련 객체를 주 객체에 어떻게 연결합니까? 정수 목록을 제외한 항목으로 item.tags를 재정의하려고하면 오류가 발생합니다. –

1

태그를 가져옵니다 (그리고 자유롭게 캐시를 사용)하여 항목 모델에 메서드를 추가합니다. 컨텍스트에 따라 모델 개체를 사전에 serialize합니다.이 메서드는 발생하는 각 형식의 개체를 serialize하는 방법을 설명하므로 serialization에서 일부 필드를 삭제하거나 모델에없는 새 필드를 추가 할 수 있습니다. 코드에는 주석이 없지만 unit tests에서 사용 샘플을 찾을 수 있습니다. 희망이 도움이됩니다.

+0

게시 해 주셔서 감사합니다. 제가 확인해 보겠습니다! –

관련 문제