在Django REST Framework中创建自定义布尔字段

js4nwp54  于 2023-11-20  发布在  Go
关注(0)|答案(2)|浏览(143)

我是Django REST框架的新手。
我的模型的相关部分看起来像这样(简化):

class Action(models.Model):
    type = models.CharField()
    bonus = models.IntegerField()

class User(models.Model):
    auth = models.OneToOneField(AuthUser)
    display_name = models.CharField()

class Comment(models.Model):
    contributor = models.ForeignKey(User)
    content = models.TextField()

class Activity(models.Model):
    user = models.ForeignKey(User)
    target_comment = models.ForeignKey(Comment)
    action = models.ForeignKey(Action)

字符串
我希望我的一个API端点能够返回如下内容:

{
    ...
    "comments":
    [
        {
            "id": 1,
            ...
            "curr_user_upvoted": true
        },
        ...
    ]
}


我知道为了获取“Curr_user_upvoted”的值而需要执行的查询,但我不知道如何使它成为API表示的一部分。
我知道如何创建自定义关系字段,但这没有帮助,因为“Curr_user_upvoted”既不是字段也不是关系。
你知道吗?

mwecs4sa

mwecs4sa1#

你可以创建一个SerializerMethodField来完成这个任务。这只是序列化器类上的一个方法,它返回你想要的值。
方法名默认为get_curr_user_upvoted-换句话说,它应该是get_后跟字段名,尽管如果您愿意,可以向字段传递显式的method_name参数。

ds97pgxw

ds97pgxw2#

这里有一些解决方案。
1.首先使用序列化方法字段。

class CommentSerializer(serializers.ModelSerializer):
    curr_user_upvoted = serializers.SerializerMethodField()

    class Meta:
        model = Comment
        fields = ('id', 'curr_user_upvoted')

    def get_curr_user_upvoted(self, obj):
        return obj.activity_set.filter(
            user=self.context['request'].user,
            action__type='upvote' 
        ).exists()

class MainSerializer(serializers.Serializer):
    comments = CommentSerializer(many=True)

字符串
1.将其添加到模型类中。

class Comment(models.Model):
    contributor = models.ForeignKey(User)
    content = models.TextField()

    def curr_user_upvoted(self):
        user = get_current_user()
        self.activity_set.filter(
            user=user,
            action__type='upvote' 
        ).exists()

class CommentSerializer(serializers.ModelSerializer):
    curr_user_upvoted = serializers.BooleanField()

    class Meta:
        model = Comment
        fields = ('id', 'curr_user_upvoted')

class MainSerializer(serializers.Serializer):
    comments = CommentSerializer(many=True)


你可以通过这种方式获取当前用户
https://stackoverflow.com/a/21786764/14387799
1.添加自定义字段

class CurrentUserUpvotedField(serializers.Field):
    def to_representation(self, instance):
        return instance.activity_set.filter(
            user=self.context.get('request').user,
            action__type='upvote'
        ).exists()

class CommentSerializer(serializers.ModelSerializer):
    curr_user_upvoted = CurrentUserUpvotedField()

    class Meta:
        model = Comment
        fields = ('id', 'curr_user_upvoted')

class MainSerializer(serializers.Serializer):
    comments = CommentSerializer(many=True)


为此,您需要添加将请求传递到上下文

MainSerializer(data, context={"request": request)

相关问题