【问题标题】:Django filter foreignkey fieldDjango过滤外键字段
【发布时间】:2014-08-24 05:07:01
【问题描述】:

短版:

我有一个用于食谱的 Django 应用程序,并且想要过滤要发送到我视图中的模板的数据。我基本上希望将特定用户添加的所有接收作为上下文发送。以下过滤返回错误消息invalid literal for int() with base 10: 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 具有用户的外键这一事实有关。我还尝试根据 [1] 将过滤器参数更改为 recipe__add_by__add_by = uname,但 Django 随后返回错误消息“无法将关键字'recipe'解析为字段”,这似乎很明显。我的网址是:

url(r'^profile/([a-zA-Z0-9]+)/$', 'profile', name='*app_name*-profile'),

感谢您的回复。对不起,如果这应该很明显。

[1]Django models filter by foreignkey

【问题讨论】:

  • 你的 recipe.added_by 用户和登录用户一样吗?

标签: python django filter foreign-keys


【解决方案1】:

你可以试试:

 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

【讨论】:

  • 我认为 uname 表示任何用户名,而不仅仅是登录用户的用户名。
  • 太棒了!就是这样。非常感谢。
  • 乐于帮助@kennha。如果此答案解决了您的问题,请将其标记为已接受(答案左侧的复选标记)
【解决方案2】:

当子类定义为

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

makemigration 将外键生成为 added_by_id。 因此,您必须在过滤器中使用相应的字段名称。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2021-12-09
    • 2018-12-13
    • 2011-03-14
    • 2023-03-16
    • 2020-09-07
    相关资源
    最近更新 更多