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