首页 > 解决方案 > 如何仅为当前用户过滤 serializers.ChoiceField 的输出值?

问题描述

我尝试过滤serializers.ChoiceField当前用户的输出值。

模型.py

class Project(models.Model):
    project_name = models.CharField(max_length=150, default='')
    user = models.ForeignKey(get_user_model(), null=True, on_delete=models.CASCADE)

class Task(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    task_name = models.CharField(max_length=250, default='')
    is_done = models.BooleanField(default=False)

序列化程序.py

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ['project_name']


class TaskSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
    user_project = serializers.ChoiceField(
        choices=[(project.pk, project) for project in Project.objects.filter(user=user)]
    )

    class Meta:
        model = Task
        fields = ['task_name', 'is_done', 'user_project']

我有错误

TypeError:字段 'id' 需要一个数字,但得到 PrimaryKeyRelatedField(default=CurrentUserDefault(), read_only=True)。

我尝试覆盖类CurrentUserDefault

序列化程序.py

class CurrentUserDefault:
    def set_context(self, serializer_field):
        self.user_id = serializer_field.context['request'].user.id

    def __call__(self):
        return self.user_id


class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ['project_name']


class TaskSerializer(serializers.ModelSerializer):
    user_project = serializers.ChoiceField(
        choices=[(project.pk, project) for project in Project.objects.filter(user=CurrentUserDefault())]
    )

    class Meta:
        model = Task
        fields = ['task_name', 'is_done', 'user_project']

错误:

TypeError:字段 'id' 需要一个数字,但在 0x000001C260901250> 处得到 <api.serializers.CurrentUserDefault 对象>。


毕竟,我写了这段代码,得到了我想要的结果。

class TaskSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        user = kwargs['context']['request'].user
        super().__init__(*args, **kwargs)
        self.fields['project'].queryset = Project.objects.filter(user=user)

    class Meta:
        model = Task
        fields = ['task_name', 'is_done', 'project']

这个解决方案正确吗?

标签: django-rest-framework

解决方案


推荐阅读