我正在尝试在DRF3中创建可写的嵌套序列化程序。
我有一个模型音乐会,其用户模型为m2m的“技术人员”。
我已经在视图中成功添加了连接到Concert实例的用户列表。现在,我希望能够将技术员/用户添加到Concert模型。
到目前为止,这是我的序列化器:
class ConcertListSerializer(serializers.ModelSerializer):
technicians = UserDetailSerializer(
many=True,
read_only=True
)
class Meta:
model = models.Concert
fields = [
'name',
'date',
'technicians',
'id',
]
def create(self, validated_data):
# list of pk's
technicians_data = validated_data.pop('technicians')
concert = Concert.object.create(**validated_data)
for tech in technicians_data:
tech, created = User.objects.get(id = tech)
concert.technicians.add({
"name": str(tech.name),
"email": str(tech.email),
"is_staff": tech.is_staff,
"is_admin": tech.is_admin,
"is_superuser": tech.is_superuser,
"groups": tech.groups,
"id": tech.id
})
return concert
我希望能够仅添加要添加的技术人员的pk / id列表。因此,例如:
"technicians": [1,2,3]
将用户1、2、3添加到Concert的技术人员字段。
每当我这样做时,我都会得到KeyError,它只说“技术人员”,并引用我create()函数的第一行...
我要在字典中添加的字段是用户模型的所有字段。这是我执行GET请求时显示的格式。
这是Concert模型:
class Concert(models.Model):
name = models.CharField(max_length=255)
date = models.DateTimeField(default =
datetime.now(pytz.timezone('Europe/Oslo'))
+ timedelta(days=30)
)
technicians = models.ManyToManyField(User) # relation to user model
编辑:
这是对预制example-concert的GET请求的响应:
{
"name": "Concert-name",
"date": "2017-10-28T12:11:26.180000Z",
"technicians": [
{
"name": "",
"email": "[email protected]",
"is_staff": true,
"is_admin": true,
"is_superuser": false,
"groups": [
5
],
"id": 2
},
{
"name": "",
"email": "[email protected]",
"is_staff": true,
"is_admin": true,
"is_superuser": false,
"groups": [
5
],
"id": 3
}
],
"id": 1
}
最佳答案
您应该从上下文请求中获取数据,因为您提交的文件为validated_data
中的只读文件
def create(self, validated_data):
# list of pk's
# instaed of technicians_data = validated_data.pop('technicians')
# use next two lines
request = self.context.get('request')
technicians_data = request.data.get('technicians')
concert = Concert.object.create(**validated_data)
# Added technicians
for tech in technicians_data:
user = User.objects.get(id=tech)
concert.technicians.add(user)
return concert