DRF:可在序列化器选择字段“选择”中调用

时间:2018-06-04 05:35:58

标签: django django-rest-framework

我有一个带有'所有者'字段的管理序列化程序。我希望当前用户填充此字段的选项,但是当涉及到运行迁移时,我得到一个TypeError,表明drf不支持序列化器选择字段的callables。 django支持模型选择字段的callable,但显然用户会随时改变,所以我希望在serializer实例化中填充这个字段。任何人都可以建议一个可行的解决方案吗?

def get_available_users():
    return [(u.id, u.username) for u in User.objects.all()]


class AdminCreateSerializer(CreateSerializer, AdminSerializer):
    owner = serializers.ChoiceField(choices=get_available_users)


>> TypeError: 'function' object is not iterable

3 个答案:

答案 0 :(得分:2)

让您的迁移正常工作

添加

from django.utils.functional import lazy

然后

owner = serializers.ChoiceField(choices=lazy(get_available_users, tuple)())

def get_available_users():
    try:
        _users = [(u.id, u.username) for u in User.objects.all()]
    except:
        _users = list(tuple())
    return _users

答案 1 :(得分:0)

执行以下操作:

User_detail = [(u.id, u.username) for u in User.objects.all()]

class AdminCreateSerializer(CreateSerializer, AdminSerializer):
    owner = serializers.ChoiceField(choices=User_detail)

答案 2 :(得分:0)

我发现这里的解决方案是重构和使用DRF的PrimaryKeyRelatedField序列化程序字段(PrimaryKeyRelatedField可以用于使用其主键表示关系的目标。):https://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield