Django DRF -在API调用中返回整个其他用户配置文件



我有一个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.

这返回:

{
"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)

问题:

我试图在配置文件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']

它返回用户的电子邮件谁是收藏夹,但我希望它返回他们的整个个人资料。

{
"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']