Python Django Rest框架ParentRelatedField元数据选择

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

大家好

我有最新的django rest框架,我正试图让序列化程序为
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',
}