我正在尝试在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

10-07 18:00