Как получить одинаковый формат для массива javascript и django, установленных на бэкэнде?

У меня есть код, который, когда пользователь входит в систему, выбирает рецепты, которые применяются к нему, на основе ингредиентов (предметов), которые он ранее идентифицировал как идентифицированные как имущество.

Этот код получает идентификаторы элементов, которые уже есть у пользователя:

if request.user.is_authenticated():
    user_items = [possession.item for possession in request.user.possession_set.all()]
    user_items_ids = [item.id for item in user_items]
    uids = set(user_items_ids)

Следующий код, который уже существовал, где я сталкиваюсь с проблемами...

recipes = [(recipe, len(set([item.id for item in recipe.items.all()]) & uids), recipe.votes) for recipe in recipes]

Я создал еще одну часть сайта, которая позволяет людям, которые еще не зарегистрировались, просто выбрать несколько компонентов. Я делаю это с помощью некоторого jQuery на внешнем интерфейсе, а затем отправляю результаты на сервер:

var ingredient_set = [];
$('.temp_ingredient').each(function(index){
ingredient_set[index] = $(this).attr('id').substr(4);
});

$.get('/recipes/discover', { 'ingredients': ingredient_set }, 
function(){
    alert("Success");
});

Проблема в том, когда я получаю их на стороне Django, с этим кодом:

uids = request.GET['ingredients']

Я получаю следующую ошибку:

unsupported operand type(s) for &: 'set' and 'unicode'

По сути, я знаю, что они не в одном формате, но я не знаю, как заставить их быть совместимыми.

1 ответ

Решение

Вы отправляете массив JavaScript в строке запроса вашего запроса GET. Поэтому вы должны использовать request.GET.getlist. Просто используя request.GET[key] дает вам последнее значение для этого ключа.

>> request.GET['foo[]']
u'5'
>> request.GET.getlist('foo[]')
[u'1', u'2', u'4', u'5']

Обратите внимание, что значения являются Unicode, но вы, вероятно, нуждаетесь в них как целые числа, поэтому не забудьте преобразовать их.

uids = request.GET.getlist('foo[]')
uids = set([int(x) for x in uids])

Я не уверен, почему мой ключ на самом деле foo[] и не только foo, но, как вы получаете нет KeyError, request.GET.getlist('ingredients') должно сработать.

Другие вопросы по тегам