【发布时间】:2019-05-17 14:31:37
【问题描述】:
我有模型和序列化器,该模型中有 ArrayField(postgres)。
现在我想创建一个序列化器字段,它将接收列表 [1,2] 并将其保存到对象,但序列化器中的列表和详细信息显示 JSON 对象列表。
型号:
class User(models.Model):
email = models.EmailField('Email', unique=True, blank=False)
full_name = models.CharField(
'Full name', max_length=150, blank=True, null=True)
roles = ArrayField(
models.PositiveSmallIntegerField(),
default=list,
blank=True
)
序列化器:
class ArraySerializerField(ListField):
def __init__(self, queryset, serializer_class):
super(ArraySerializerField, self).__init__()
self.queryset = queryset
self.serializer_class = serializer_class
def to_representation(self, value):
if value:
qs = self.queryset.filter(pk__in=value)
return self.serializer_class(qs, many=True).data
return []
def to_internal_value(self, value):
super(ArraySerializerField, self).to_internal_value(value)
print(value) # [1, 2]
return value
class UserSerializer(SerializerExtensionsMixin, serializers.ModelSerializer):
roles = ArraySerializerField(queryset=Role.objects.all(), serializer_class=RoleSerializer)
class Meta:
model = User
fields = ('id', 'email', 'full_name', 'roles')
def create(self, validated_data):
print(validated_data)
# {'email': 'test@test.com', 'full_name': 'Test', 'roles': []}
user = super(UserSerializer, self).create(validated_data)
return user
现在,当我提出列表或详细信息请求时,一切正常,我得到一个 JSON 形式的角色列表。
但是当我尝试发布数据并使用此数据发送时:
{
"email": "test@test.com",
"full_name": "Test",
"roles": [1, 2]
}
create 方法中的validated_data 始终将角色显示为[],并且在没有角色的情况下保存对象,但从to_internal_value 打印显示[1, 2]。
我做错了什么?它应该保存发送的数据,因为to_internal_value 工作正常。
编辑:
GET 和 LIST 响应给了我正确的格式:
{
"id": 1,
"email": "test@test.com",
"full_name": "Test",
"roles": [
{
"id": 1,
"name": "Role 1"
},
{
"id": 2,
"name": "Role 2"
}
]
}
【问题讨论】:
标签: python django postgresql django-rest-framework