Как получить одинаковый формат для массива 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')
должно сработать.