![](/img/trans.png)
[英]How to combine two querysets from two models? Django Rest Framework
[英]How to edit user profile in django rest framework from two models and save the change
我正在嘗試創建一個端點來編輯下面的用戶模型和自定義配置文件模型。
模型.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 中,我會這樣做:
視圖.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 方法。
希望這可以幫助!
看。 你可以讓它更容易。 讓我們以 Post 模型為例(例如):
class Post(models.Model):
author = models.ForeignKey(base.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=50)
text = models.TextField()
likes = models.ManyToManyField(base.AUTH_USER_MODEL, blank=True, related_name='post_likes')
created_date = models.DateTimeField(default=timezone.now)
您應該在序列化程序中對其進行描述(序列化程序類似於 DTO。它將數據轉換為服務友好的 JSON 視圖):
class PostCreateUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'text']
最后一部分 - 端點:
class PostUpdateView(UpdateAPIView):
serializer_class = PostCreateUpdateSerializer
def get_queryset(self):
return Post.objects.filter(author=self.request.user)
還有一件事情。 您不應該為您的用戶模型再創建一張表。 這是由於 BaseUser 模型的擴展。 幫助鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.