select_related () и много-много полей с ajax (Django) - PullRequest
1 голос
/ 17 ноября 2009

У меня простое представление, что я хочу отвечать как на 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 ]

2 голосов
/ 17 ноября 2009

Обновление - кажется, Django не особенно хорошо это поддерживает , но есть сторонний сериализатор, который делает:

DjangoFullSerializers

1 голос
/ 17 ноября 2009

Я написал некоторый код для выполнения сериализации в моем проекте. Он сериализует объекты модели в словари на основе контекста, который описывает, как сериализовать объекты каждого встреченного типа, поэтому вы можете удалить некоторые поля из сериализации или добавить новые поля, отсутствующие в модели. В коде отсутствуют комментарии, но вы можете найти примеры использования в модульных тестах . Надеюсь, это поможет.

1 голос
/ 17 ноября 2009

Вы можете сделать массовый выбор , используя эти идентификаторы (возможно, самое простое решение)

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

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

edit: Мой совет - либо использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...