django-rest-framework - 如何仅为当前用户过滤 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']
这个解决方案正确吗?
解决方案
推荐阅读
- javascript - 如何让 magnific popup 与数组一起使用
- python - Keras 中 LSTM 模型训练一个时期中步数的重要性
- php - 使用 date_sunrise() 和 date_sunset() php 计算白天和晚上的时间量
- wordpress - WPForo 插件。登录现在是 wp-adminlogin,我会根据我使用的计算机获得不同的菜单?
- mongodb - Mongodb - 仅列出与所选ID组合的某些属性
- python - 不允许的方法(POST):/home/
- javascript - 具有对象内类实例的数组的硬拷贝
- node.js - TypeError:无法读取未定义的 Nodejs MSSQL 存储过程的属性“类型”
- c# - 寻找极值点 - 使用 C# 的凸包
- python - 向后添加和迭代链表以产生反向总和