我正在尝试创建一个端点来编辑下面的用户模型和自定义配置文件模型。
models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(max_length=500)
location = models.CharField(max_length=50)
image = models.ImageField(default='default.jpg', upload_to='profile')
在常规 django 中我会这样做:
views.py
def edit_profile(request):
if request.method == 'POST':
form = EditProfileForm(request.POST, instance=request.user)
extended_profile_form = ProfileForm(request.POST,
request.FILES,
instance=request.user.profile)
if form.is_valid() and extended_profile_form.is_valid():
form.save()
extended_profile_form.save()
return redirect('accounts:profile')
else:
form = EditProfileForm(instance=request.user)
extended_profile_form = ProfileForm(instance=request.user.profile)
context = {
'form':form,
'extended_profile_form':extended_profile_form
}
return render(request, 'accounts/edit-profile.html', context)
Django Rest框架的等价物是什么?
我已经尝试过:
views.py (Django Rest框架)
@api_view(['GET','PUT'])
def profile(request):
if request.method == 'GET':
user = User.objects.filter(username=request.user)
profile_user = Profile.objects.filter(user=request.user)
serializer_user = UserSerializer(user, many=True)
serializer_profile_user = ProfileSerializer(profile_user, many=True)
result = {'serializer_user': serializer_user.data, 'serializer_profile_user': serializer_profile_user.data}
return Response(result)
elif request.method == 'PUT':
user = User.objects.filter(username=request.user)
profile_user = Profile.objects.filter(user=request.user)
serializer_user = UserSerializer(user, data=request.data)
serializer_profile_user = ProfileSerializer(profile_user, data=request.data)
if serializer_user.is_valid() and serializer_profile_user.is_valid():
serializer_user.save()
serializer_profile_user.save()
result = {'serializer_user': serializer_user.data, 'serializer_profile_user': serializer_profile_user.data}
return Response(result)
result = {'serializer_user': serializer_user.data, 'serializer_profile_user': serializer_profile_user.data}
return Response(result.errors, status=status.HTTP_400_BAD_REQUEST)
当我浏览端点时,它确实显示 serializer_user
和 serializer_profile_user
数据,但我无法使用 DRF 可浏览 API 编辑任何这些数据。
我是否认为上面的代码相当于普通 django 中用于编辑用户个人资料的代码?
最佳答案
它对我来说看起来不错,但你需要替换它:
if request.method == 'GET':
user = User.objects.filter(username=request.user)
这样:
if request.method == 'GET':
try:
user = User.objects.get(id=request.user.id)
except User.DoesNotExist:
return Response(data='no such user!', status=status.HTTP_400_BAD_REQUEST)
# you need to use objects.get because objects.filter returns a queryset not an abject
因为 request.user 是 User 模型的实例,因此您无法将其与用户的属性(在您的情况下为用户名)进行比较
PS:您的 PUT 方法也同样如此。
希望这有帮助!
关于python - 如何在 Django Rest Framework 中从两个模型编辑用户配置文件并保存更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436549/