Django 过滤外键字段
简短版本:
我有一个用Django做的食谱应用,想要在视图中过滤数据,以便发送到模板。我基本上想要把特定用户添加的所有食谱作为上下文发送。可是,下面的过滤操作返回了一个错误信息无效的字面量,无法转换为整数:my_username。
recipes = Recipe.objects.filter(added_by = uname)
变量uname是从模板传过来的。另一方面,基于request.user的过滤操作是可以正常工作的,但这并不是我想要的。
recipes = Recipe.objects.filter(added_by = request.user)
详细信息:
我的模型(相关字段)如下:
class Recipe (models.Model):
...
...
added_by = models.ForeignKey(User)
其中User是一个已经存在的Django用户。当我在模板中调用{{ recipe.added_by }}时,我得到了想要的用户名。这个用户名通过href="/profile/{{recipe.added_by}}"传递到视图中,视图看起来是这样的:
def profile(request, uname):
print uname #Correct username printed
print request.user #Logged in user (not relevant, as userprofile should be visible for all)
recipes = Recipe.objects.filter(added_by = uname) #Does not work. Why?
#recipes = Recipe.objects.filter(added_by = request.user)
form = CommentForm(request.POST)
context = {
'uname': uname,
'recipes': recipes,
'form': form,
}
return render(request, '*app_name*/profile.html', context)
我不太确定我漏掉了什么,但从我能看出来的,似乎和added_by与用户之间的外键有关。我还尝试把过滤参数改成recipe__added_by__added_by = uname,根据[1]的说法,但Django返回了一个错误,说“无法将关键字'recipe'解析为字段”,这看起来很明显。我的网址是:
url(r'^profile/([a-zA-Z0-9]+)/$', 'profile', name='*app_name*-profile'),
谢谢任何回复。抱歉如果这本该是显而易见的。
[1] Django模型通过外键过滤
2 个回答
当子类定义为
class Recipe (models.Model):
...
...
added_by = models.ForeignKey(User)
在生成迁移文件时,会创建一个外键,名字叫added_by_id。所以,你在筛选的时候需要用这个对应的字段名。
比如:recipes = Recipe.objects.filter(added_by_id = uname)
你可以试试这样:
recipes = Recipe.objects.filter(added_by__username = uname)
而且 request.user
在 Recipe.objects.filter(added_by = request.user)
中运行得很好,因为 request.user
是一个对象。详细信息请查看这个链接:https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships