我有一个简单的视图,我想要响应ajax和常规HTTP请求。简化,它看起来像这样:
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()来跟踪多对多的关系 - 有人能为我提供传递该信息的最佳实践,还是一个例子?
答案 0 :(得分:2)
更新 - 似乎是Django doesn't support this particularly well,但是有第三方序列化程序可以:
答案 1 :(得分: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为您处理此问题。或者只是在Item模型中添加一个获取标记的方法(并自由使用缓存)
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
答案 2 :(得分:1)
我已经写了some code来在我的项目中进行序列化。它根据上下文将模型对象序列化为字典,该上下文描述了如何序列化每个遇到类型的对象,因此您可以从序列化中删除一些字段或添加模型中不存在的新字段。代码缺少注释,但您可以在unit tests中找到使用示例。希望有所帮助。