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