根据 Python Django 中的值数组更改数据库中的项目
Change items in database based on an array of values in Python Django
我有一串值被发布到我的 python API
["7779987","5559098","2453987"]
这些数字是我数据库中用户的唯一标识符。这些用户有一个 'amount' 元组。我想要做的是,当收到数组时,在我的代码中,我得到所有在字符串中有 ID 的用户,并从他们的当前金额值中减去 10。
这是我尝试过的方法,但我知道我做错了什么。我该怎么做?
class PayForTrips(APIView):
def post(self, request):
print(request.data)
for index_number in request.data:
print(index_number + "; ")
user = User.objects.get(index_number=index_number)
print("old user amount" + str(user.amount))
user.amount -= 10
print("new user amount" + str(user.amount))
serializer = UserSerializer(data=user)// here is where the problem is
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
编辑:我是 Django 的新手,所以我不知道该怎么做。如果我的代码完全错误,你能告诉我如何实现这个目标吗?
编辑:@Daniel Roseman 的解决方案解决了问题。这是有效的代码:
class PayForTrips(APIView):
def post(self, request):
print(request.data)
for index_number in request.data:
print(index_number + "; ")
user = User.objects.get(index_number=index_number)
print(user)
print("old user amount" + str(user.amount))
user.amount -= 1
print("new user amount" + str(user.amount))
user.save()
return Response(status=status.HTTP_200_OK)
您应该将 many=True 参数传递给序列化程序,自定义一个 UsersSerializer 来接收和验证 user_ids 是一个好方法。最后用F更新用户
from django.db.models import F
class UsersSerializer(serializers.Serializer):
users = serializers.PrimaryKeyRelatedField(
queryset=User.objects.all(),
many=True #many=True to receive multi ids.
)
def post(self, request):
serializer = UsersSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
users = serializer.data.get('users') #since I use PrimaryKeyRelatedField, serializer.data actually returns user instances.
users = users.update(amount = F('amount')-10)
return Responce(UserSerializer(users, many=True).data) #notice, do not use data=users, since user is an instance.
and post json data: {"users":[7779987,5559098,...]}
这里的序列化器有什么意义?似乎没有任何理由使用一个。您已经获得了物品并修改了它们的数量;你需要做的就是保存它们。
另一个问题是您 return 在循环中;您需要将最后一行移出循环,然后 return 您成功更新的 ID 列表。
我有一串值被发布到我的 python API
["7779987","5559098","2453987"]
这些数字是我数据库中用户的唯一标识符。这些用户有一个 'amount' 元组。我想要做的是,当收到数组时,在我的代码中,我得到所有在字符串中有 ID 的用户,并从他们的当前金额值中减去 10。
这是我尝试过的方法,但我知道我做错了什么。我该怎么做?
class PayForTrips(APIView):
def post(self, request):
print(request.data)
for index_number in request.data:
print(index_number + "; ")
user = User.objects.get(index_number=index_number)
print("old user amount" + str(user.amount))
user.amount -= 10
print("new user amount" + str(user.amount))
serializer = UserSerializer(data=user)// here is where the problem is
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
编辑:我是 Django 的新手,所以我不知道该怎么做。如果我的代码完全错误,你能告诉我如何实现这个目标吗?
编辑:@Daniel Roseman 的解决方案解决了问题。这是有效的代码:
class PayForTrips(APIView):
def post(self, request):
print(request.data)
for index_number in request.data:
print(index_number + "; ")
user = User.objects.get(index_number=index_number)
print(user)
print("old user amount" + str(user.amount))
user.amount -= 1
print("new user amount" + str(user.amount))
user.save()
return Response(status=status.HTTP_200_OK)
您应该将 many=True 参数传递给序列化程序,自定义一个 UsersSerializer 来接收和验证 user_ids 是一个好方法。最后用F更新用户
from django.db.models import F
class UsersSerializer(serializers.Serializer):
users = serializers.PrimaryKeyRelatedField(
queryset=User.objects.all(),
many=True #many=True to receive multi ids.
)
def post(self, request):
serializer = UsersSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
users = serializer.data.get('users') #since I use PrimaryKeyRelatedField, serializer.data actually returns user instances.
users = users.update(amount = F('amount')-10)
return Responce(UserSerializer(users, many=True).data) #notice, do not use data=users, since user is an instance.
and post json data: {"users":[7779987,5559098,...]}
这里的序列化器有什么意义?似乎没有任何理由使用一个。您已经获得了物品并修改了它们的数量;你需要做的就是保存它们。
另一个问题是您 return 在循环中;您需要将最后一行移出循环,然后 return 您成功更新的 ID 列表。