Django 过滤外键字段

4 投票
2 回答
13510 浏览
提问于 2025-04-18 11:58

简短版本:

我有一个用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 个回答

1

当子类定义为

class Recipe (models.Model):
    ...
    ...
    added_by = models.ForeignKey(User)

在生成迁移文件时,会创建一个外键,名字叫added_by_id。所以,你在筛选的时候需要用这个对应的字段名。

比如:recipes = Recipe.objects.filter(added_by_id = uname)

8

你可以试试这样:

 recipes = Recipe.objects.filter(added_by__username = uname)

而且 request.userRecipe.objects.filter(added_by = request.user) 中运行得很好,因为 request.user 是一个对象。详细信息请查看这个链接:https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

撰写回答