Python Django Rest框架ParentRelatedField元数据选择
大家好强> 我有最新的django rest框架,我正试图让序列化程序为Python Django Rest框架ParentRelatedField元数据选择,python,django,django-rest-framework,Python,Django,Django Rest Framework,大家好 我有最新的django rest框架,我正试图让序列化程序为OPTIONS请求中的每个字段显示可能的选择 这是我模型的一部分 # models.py class Task(models.Model): parent = models.ForeignKey('self', blank=True, null=True, related_name='child_tasks') title = models.CharField
OPTIONS
请求中的每个字段显示可能的选择
这是我模型的一部分
# models.py
class Task(models.Model):
parent = models.ForeignKey('self',
blank=True, null=True, related_name='child_tasks')
title = models.CharField(max_length=128)
status = models.CharField(max_length=16, choices=STATUS_CHOISES, default='new')
priority = models.CharField(max_length=16, choices=PRIORITY_CHOISES, default='1')
chief = models.ForeignKey('users.SystemUser', related_name='tasks',
blank=True, null=True)
这是序列化程序
# serializers.py
class ParentRelatedField(serializers.PrimaryKeyRelatedField):
def get_queryset(self):
obj = self.context['view'].get_object()
return Task.objects.exclude(pk=obj.pk)
def get_user_choices():
return tuple([(i.id, i.system_name) for i in SystemUser.objects.all()])
class TaskDetailSerializer(serializers.Serializer):
title = serializers.CharField()
parent = ParentRelatedField(
required=False, allow_null=True
)
status = serializers.ChoiceField(choices=STATUS_CHOISES)
priority = serializers.ChoiceField(choices=PRIORITY_CHOISES)
chief = serializers.ChoiceField(choices=get_user_choices(), required=False)
我使用get\u user\u choices
函数为chief
字段实现了这一点,因此我得到:
"chief": {
"type": "choice",
"required": false,
"read_only": false,
"label": "Chief",
"choices": [
{
"value": 1,
"display_name": "First User Name"
}
]
}
ParentRelatedField
非常适合验证,但不适合元数据:
"parent": {
"type": "field",
"required": false,
"read_only": false,
"label": "Parent"
}
我不能将
ChoiceField
与函数一起使用(如chief
),因为parent
选择必须排除当前的任务
对象。解决了问题。
在和处找到了解决方案
我改变了我的领域,使之更具普遍性
class SelfExcludingRelatedField(serializers.PrimaryKeyRelatedField):
def get_queryset(self):
obj = self.context['view'].get_object()
return self.queryset.exclude(pk=obj.pk)
然后编写自定义元数据类(从github复制)
并将其添加到设置中
:
REST_FRAMEWORK = {
'DEFAULT_METADATA_CLASS': 'api_v0.metadata.CustomMetadata',
}
REST_FRAMEWORK = {
'DEFAULT_METADATA_CLASS': 'api_v0.metadata.CustomMetadata',
}