QuerySet 不按用户过滤
QuerySet doesn't filter by user
更新:
意识到这可能是由于身份验证过程中的某些错误。这是我的授权:
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 前端编写的。
出于某种原因,owner/user 未过滤物体(在本例中为老鼠)。我不想授予权限 - 任何人都应该能够访问其他人的老鼠,但在这个特定列表中,用户应该只能看到属于他们的老鼠。
运行 其他过滤器有效,例如生日。但是当我尝试按用户过滤时,没有老鼠出现。也没有错误。有什么问题吗?
对象序列化器:
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"
}
在 object/rat 的 JSON 输出中,它清楚地说明了它属于哪个用户。那么为什么过滤器不起作用?
如果您使用:
request.user
您的用户未通过身份验证。
因此它将return全部。
确保您已登录并重试
这是解决问题的新 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
部分只是为了让用户在未登录时看到所有对象。这仅用于测试目的
更新: 意识到这可能是由于身份验证过程中的某些错误。这是我的授权:
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 前端编写的。
出于某种原因,owner/user 未过滤物体(在本例中为老鼠)。我不想授予权限 - 任何人都应该能够访问其他人的老鼠,但在这个特定列表中,用户应该只能看到属于他们的老鼠。
运行 其他过滤器有效,例如生日。但是当我尝试按用户过滤时,没有老鼠出现。也没有错误。有什么问题吗?
对象序列化器:
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"
}
在 object/rat 的 JSON 输出中,它清楚地说明了它属于哪个用户。那么为什么过滤器不起作用?
如果您使用:
request.user
您的用户未通过身份验证。
因此它将return全部。
确保您已登录并重试
这是解决问题的新 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
部分只是为了让用户在未登录时看到所有对象。这仅用于测试目的