【问题标题】:QuerySet doesn't filter by userQuerySet 不按用户过滤
【发布时间】:2022-01-19 01:31:10
【问题描述】:

更新: 被告知这可能是由于身份验证过程中的一些错误。这是我的身份验证:

const LogIn = () => {
  let dispatch = useDispatch();
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");
  // const auth = useAuth();
  const history = useHistory();

  const onSubmit = async (e) => {
    e.preventDefault();
    dispatch(startLogin());
axios
  .post(
    "http://127.0.0.1:8000/api/login/",
    { username: username, password: password },
    { headers: { "Content-Type": "application/json" } }
  )
  .then((res) => {
    const users = res.data;
    dispatch(LogInSuccess(users));
    localStorage.setItem("jwt", users.auth_token);
    localStorage.setItem("user", JSON.stringify(users));
    console.log("users", users); // undefined
    history.push("/");
  })
      .catch((err) => dispatch(LogInFailure(err.message)));
  };

所以我的代码是用 Django 后端和 React 前端编写的。

出于某种原因,所有者/用户没有过滤对象(在本例中为老鼠)。我不想授予权限 - 任何人都应该能够访问其他人的老鼠,但在这个特定列表中,用户应该只能看到属于他们的老鼠。

运行其他过滤器工作,例如生日。但是当我尝试按用户过滤时,没有老鼠出现。也没有错误。有什么问题?

对象序列化器:

class RatSerializer(FlexFieldsModelSerializer):
    user         = serializers.CharField()
    body_colour  = BodyColourSerializer()
    eye_colour   = EyeColourSerializer()
    image        = ImageSerializer()

    class Meta:
        model = rat

观看次数:

   class ratViewset(FlexFieldsMixin):
         serializer_class = RatSerializer
         def get_queryset(self):
            userid = self.request.id
            return rat.objects.filter(user = userid)

用户序列化器:

class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)

class Meta:
    model = User
    fields = ('id', 'username', 'password')

以及用户的 JSON 输出:

{
        "id": 13,
        "username": "new"
    }

在对象/老鼠的 JSON 输出中,它清楚地说明了它属于哪个用户。那么为什么过滤器不起作用呢?

【问题讨论】:

  • 是否有可能self.requset.id 是一个字符串而id 字段是一个整数?所以你他们不匹配?也许将您的 self.request.id 转换为 int?
  • 根据您的情况,使用request.user 而不是从请求对象中提取查询参数也是一个好主意。如果它应该是“只显示经过身份验证的用户他们自己的对象”而不是“显示具有 id X 的用户的对象,无论身份验证如何”。如果是后者,我个人可能会将该 ID 作为 URL 的一部分而不是查询 arg。在某种程度上,我可以在 URL 声明中使用正则表达式来确保我 可以 将其解析为 int。
  • @saquintes 可能是这种情况,我该怎么做? (我是初学者)
  • @Peter DeGlopper 哦,所以您认为与其提取查询参数,不如说您的 URL 应该类似于“/userID/objects”?这是一个非常好的主意,然后用户也可以查看彼此的列表。不知道该怎么做,因为我是新手
  • 我可能会使用/objects/<userId>,但这没什么大不了的,取决于应用程序的其余部分。请在此处查看文档中的示例:docs.djangoproject.com/en/4.0/topics/http/urls/#example - 看起来功能已经先进,您只需声明 /objects/<int:userId> 或任何您想要的,然后您的视图将获得一个 int 参数。请注意,这根本不安全,它可能适合您的情况,因为您说每个人都可以看到每个人的数据,但没有什么可以强制 URL 中的 ID 是针对当前用户的。

标签: django django-queryset


【解决方案1】:

这是解决问题的新 get_query:

def get_queryset(self):
    user = self.request.user
    if user.is_anonymous:
        return rat.objects.all()
    return rat.objects.filter(user=user.id)

基本上我先获取用户,然后按 user.id 过滤。早些时候,我尝试立即获取 userId 并按此过滤。

我所做的另一项更改是将 ModelViewSet 添加到视图集中,但我认为这没有什么不同(?)

编辑:if user.is_anonymous 部分只是让用户在未登录的情况下看到所有对象。这仅用于测试目的

【讨论】:

    【解决方案2】:

    如果您使用的是: request.user

    您的用户未通过身份验证。

    因此它将全部返回。

    确保您已登录并重试

    【讨论】:

    • 我已登录,也尝试注销并再次登录。它没有显示所有对象——它没有显示:/
    • 是的,但是您登录了吗?打印request.user 并确保为请求分配了用户。如果没有,那么您没有登录到 API 框架。有时取决于您注册视图的方式,它可以忽略身份验证机制。通常当返回一个休息框架Response对象以外的东西时。
    • 如何在 JS 中打印 request.user?我发布了我的身份验证代码,也许那里有一些错误?
    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 2017-10-12
    • 2018-10-06
    • 2014-07-13
    • 2015-07-12
    • 2018-01-05
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多