2009-11-17 52 views
1

我有一個簡單的觀點,我想對AJAX和常規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

您可能希望做一個bulk select using those ids(可能是最簡單的解決方案)

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

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

編輯:我的建議是要麼使用django-tagging爲您處理這個。或者只是添加一個方法來

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時,出現錯誤。 – 2009-11-17 14:23:18

1

我已經寫some code做系列化在我的項目的項目模型,獲取標籤(並使用高速緩存寬鬆)。它根據上下文將模型對象序列化爲字典,該上下文描述如何序列化每個遇到類型的對象,因此您可以從序列化中刪除一些字段或添加模型中不存在的新字段。該代碼缺少註釋,但您可以在unit tests找到使用示例。希望有所幫助。

+0

感謝發佈 - 我會檢查出來! – 2009-11-17 18:07:11