Django rest framework 如何仅为当前用户筛选serializers.ChoiceField的输出值?

Django rest framework 如何仅为当前用户筛选serializers.ChoiceField的输出值?,django-rest-framework,Django Rest Framework,我尝试筛选序列化程序.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): pr

我尝试筛选
序列化程序.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)
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']
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']
序列化程序.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)
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']
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”应为一个数字,但得到 PrimaryKeyRelatedField(默认值=CurrentUserDefault(),只读=True)

我尝试重写类
CurrentUserDefault

序列化程序.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)
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']
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”应为一个数字,但得到


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

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']
这个解决方案正确吗