我有一些代码,当用户登录时,根据他之前确定为财产的成分(项目)选择适用于他的食谱。
此代码获取用户已拥有的项目的ID:
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'
基本上,我知道它们的格式不同,但我不知道如何让它们兼容。
答案 0 :(得分:1)
您正在GET请求的查询字符串中发送JavaScript数组。因此,您应该使用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')
应该有效。