Django DRF - API 调用中的整个其他用户配置文件 return
Django DRF - Entire Other User Profile return in API call
我有一个 UserSerializer(我使用了 CustomUser 模型)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = ['id', 'first_name', 'last_name', 'email', 'is_typeA', 'is_typeB']
read_only_fields = ['id', 'email', 'is_typeA', 'is_typeB']
我有一个针对每种用户类型的配置文件模型,还有一个序列化器。
class TypeASerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = TypeAProfile
fields = ['user_id','user','course', 'ndex', 'created_at']
read_only_fields = ['id', 'created_at']
class TypeBSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = TypeBProfile
fields = ['user_id', 'user', 'course', 'rating', 'created_at']
read_only_fields = ['id', 'created_at', 'rating']
我有一个端点来获取登录用户的配置文件。
class MyProfile(APIView):
def get(self, request, *args, **kwargs):
serializer = get_user_profile(request.user)
return Response(serializer.data)
def patch(self, request, *args, **kwargs):
if request.user.is_typeA:
typeauser = TypeAProfile.objects.get(user_id=request.user.id)
user_updates = request.data.pop('user')
serializer = TypeASerializer(typeauser, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
user_serializer = UserSerializer(typea.user, data=user_updates, partial=True)
user_serializer.is_valid(raise_exception=True)
user_serializer.save()
return Response(serializer.data)
elif request.user.is_typea:
typebuser = TypeBProfile.objects.get(user_id=request.user.id)
user_updates = request.data.pop('user')
serializer = TypeBSerializer(typebuser, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
user_serializer = UserSerializer(typebuser.user, data=user_updates, partial=True)
user_serializer.is_valid(raise_exception=True)
user_serializer.save()
return Response(serializer.data)
serializer = UserSerializer(request.user, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
我的端点是:/profile.
这个return:
{
"user_id": 1,
"user": {
"id": 1,
"first_name": "John",
"last_name": "Smith",
"email": "email@email.com",
"is_typeA": false,
"is_typeB": true
},
"course": "Udemy-123",
"index": 2
"created_at": "2022-04-12T01:43:49.091825Z"
}
我添加了一个收藏模型-这是为了让用户互相收藏。 A类用户可以收藏B类用户
class Favourite(models.Model):
typeA = models.ForeignKey(to=TypeAProfile, on_delete=models.CASCADE, related_name='favourites')
typeB = models.ForeignKey(to=TypeBProfile, on_delete=models.CASCADE, related_name='fans')
def __str__(self):
return str(self.typeB)
问题:
我正在尝试 return 调用个人资料 API 上的收藏夹列表,但到目前为止我无法理解它。
我将收藏夹添加到 TypeA 配置文件序列化程序中:
class TypeASerializer(serializers.ModelSerializer):
user = UserSerializer()
favourites = serializers.StringRelatedField(many=True)
class Meta:
model = TypeAProfile
fields = ['user_id','user', 'course', 'handicap_index', 'created_at', 'favourites']
read_only_fields = ['id', 'created_at']
它 return 是最喜欢的用户的电子邮件,但我希望它 return 他们的整个个人资料。
{
"user_id": 1,
"user": {
"id": 1,
"first_name": "John",
"last_name": "Smith",
"email": "email@email.com",
"is_typeA": false,
"is_typeB": true
},
"course": "Udemy-123",
"index": 2,
"created_at": "2022-04-12T01:43:49.091825Z",
"favourites": [
"test1@email.com",
"test2@email.com"
]
}
你可以这样写:
class TypeASerializer(serializers.ModelSerializer):
user = UserSerializer()
favourites = serializers.SerializerMethodField()
def get_favourites(self, obj):
return TypeBSerializer([favourite.typeB for favourite in obj.favourites.all()], many=True).data
class Meta:
model = TypeAProfile
fields = ['user_id','user', 'course', 'handicap_index', 'created_at', 'favourites']
read_only_fields = ['id', 'created_at']
我有一个 UserSerializer(我使用了 CustomUser 模型)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = ['id', 'first_name', 'last_name', 'email', 'is_typeA', 'is_typeB']
read_only_fields = ['id', 'email', 'is_typeA', 'is_typeB']
我有一个针对每种用户类型的配置文件模型,还有一个序列化器。
class TypeASerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = TypeAProfile
fields = ['user_id','user','course', 'ndex', 'created_at']
read_only_fields = ['id', 'created_at']
class TypeBSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = TypeBProfile
fields = ['user_id', 'user', 'course', 'rating', 'created_at']
read_only_fields = ['id', 'created_at', 'rating']
我有一个端点来获取登录用户的配置文件。
class MyProfile(APIView):
def get(self, request, *args, **kwargs):
serializer = get_user_profile(request.user)
return Response(serializer.data)
def patch(self, request, *args, **kwargs):
if request.user.is_typeA:
typeauser = TypeAProfile.objects.get(user_id=request.user.id)
user_updates = request.data.pop('user')
serializer = TypeASerializer(typeauser, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
user_serializer = UserSerializer(typea.user, data=user_updates, partial=True)
user_serializer.is_valid(raise_exception=True)
user_serializer.save()
return Response(serializer.data)
elif request.user.is_typea:
typebuser = TypeBProfile.objects.get(user_id=request.user.id)
user_updates = request.data.pop('user')
serializer = TypeBSerializer(typebuser, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
user_serializer = UserSerializer(typebuser.user, data=user_updates, partial=True)
user_serializer.is_valid(raise_exception=True)
user_serializer.save()
return Response(serializer.data)
serializer = UserSerializer(request.user, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
我的端点是:/profile.
这个return:
{
"user_id": 1,
"user": {
"id": 1,
"first_name": "John",
"last_name": "Smith",
"email": "email@email.com",
"is_typeA": false,
"is_typeB": true
},
"course": "Udemy-123",
"index": 2
"created_at": "2022-04-12T01:43:49.091825Z"
}
我添加了一个收藏模型-这是为了让用户互相收藏。 A类用户可以收藏B类用户
class Favourite(models.Model):
typeA = models.ForeignKey(to=TypeAProfile, on_delete=models.CASCADE, related_name='favourites')
typeB = models.ForeignKey(to=TypeBProfile, on_delete=models.CASCADE, related_name='fans')
def __str__(self):
return str(self.typeB)
问题:
我正在尝试 return 调用个人资料 API 上的收藏夹列表,但到目前为止我无法理解它。
我将收藏夹添加到 TypeA 配置文件序列化程序中:
class TypeASerializer(serializers.ModelSerializer):
user = UserSerializer()
favourites = serializers.StringRelatedField(many=True)
class Meta:
model = TypeAProfile
fields = ['user_id','user', 'course', 'handicap_index', 'created_at', 'favourites']
read_only_fields = ['id', 'created_at']
它 return 是最喜欢的用户的电子邮件,但我希望它 return 他们的整个个人资料。
{
"user_id": 1,
"user": {
"id": 1,
"first_name": "John",
"last_name": "Smith",
"email": "email@email.com",
"is_typeA": false,
"is_typeB": true
},
"course": "Udemy-123",
"index": 2,
"created_at": "2022-04-12T01:43:49.091825Z",
"favourites": [
"test1@email.com",
"test2@email.com"
]
}
你可以这样写:
class TypeASerializer(serializers.ModelSerializer):
user = UserSerializer()
favourites = serializers.SerializerMethodField()
def get_favourites(self, obj):
return TypeBSerializer([favourite.typeB for favourite in obj.favourites.all()], many=True).data
class Meta:
model = TypeAProfile
fields = ['user_id','user', 'course', 'handicap_index', 'created_at', 'favourites']
read_only_fields = ['id', 'created_at']