【问题标题】:How to serialize extra fields. Django-Rest-Framework如何序列化额外的字段。 Django-Rest-Framework
【发布时间】:2022-08-08 00:29:00
【问题描述】:

我正在尝试为 \"following_user\" 返回额外的数据,但我正在返回 \"user\" 实例的数据

获取用户以下列表的视图:

class UsersFollowing(generics.ListAPIView):
    authentication_class = [authentication.TokenAuthentication]
    permission_class = [permissions.IsAuthenticated]
    serializer_class = FollowingSerializer

    def get_queryset(self):
        user = self.request.GET.get(\'user_id\')
        obj = Follow.objects.filter(user=user)

        return obj

序列化器:

class FollowingSerializer(serializers.ModelSerializer):
    avi_pic = serializers.SerializerMethodField(\'get_avi_pic\')
    username = serializers.SerializerMethodField(\'get_username\')
    first_name = serializers.SerializerMethodField(\'get_first_name\')
    last_name = serializers.SerializerMethodField(\'get_last_name\')

    def get_username(self, obj):
        username = obj.following_user.username
        return username
    
    def get_first_name(self, obj):
        first_name = obj.following_user.first_name
        return first_name
    
    def get_last_name(self, obj):
        last_name = obj.following_user.last_name
        return last_name

    class Meta:
        model = Follow
        fields = \"__all__\"

我的关注模型:

class Follow(models.Model):
    user = models.ForeignKey(
        \"User\", related_name=\"follower\", on_delete=models.CASCADE)
    following_user = models.ForeignKey(
        \"User\", related_name=\"following\", blank=True, on_delete=models.CASCADE)
    date_followed = models.DateTimeField(auto_now_add=True)

我的用户模型:

class User(AbstractUser):
    objects = UserManager()
    avi_pic = models.ImageField(
        _(\'avi_pic\'), upload_to=aviFile, null=True, blank=True)
    email = models.EmailField(max_length=250, unique=True)
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    username = models.CharField(max_length=60, unique=True)

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:

    我认为您对外键字段的命名不好。通常最好不要在结尾添加单词id。然后 Django ORM 会自动添加名为user_id 的字段。

    class Follow(models.Model):
        user = models.ForeignKey(
            "User", related_name="follower", on_delete=models.CASCADE)
        following_user = models.ForeignKey(
            "User", related_name="following", blank=True, on_delete=models.CASCADE)
        date_followed = models.DateTimeField(auto_now_add=True)
    

    然后在序列化器中,您可以设置User 模型的序列化器。

    class FollowingSerializer(serializers.ModelSerializer):
        user = UserSerializer(read_only = True)
        following_user = UserSerializer(read_only = True)
    
        class Meta:
            model = Follow
            fields = "__all__"
    

    【讨论】:

    • 我更新了序列化程序和视图,但现在我正在获取“用户”实例而不是“following_user”的数据
    • 没关系它正在返回正确的数据。感谢您的时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2015-09-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多