select_related()以及带有ajax(Django)的多对多字段

时间:2009-11-17 12:28:10

标签: jquery ajax django json many-to-many

我有一个简单的视图,我想要响应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()来跟踪多对多的关系 - 有人能为我提供传递该信息的最佳实践,还是一个例子?

3 个答案:

答案 0 :(得分:2)

更新 - 似乎是Django doesn't support this particularly well,但是有第三方序列化程序可以:

DjangoFullSerializers

答案 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中找到使用示例。希望有所帮助。