当前位置: 代码迷 >> python >> 为Django中的许多字段定制模型序列化器
  详细解决方案

为Django中的许多字段定制模型序列化器

热度:61   发布时间:2023-07-14 08:57:56.0

我需要一些指导以通用的方式为包含许多字段的模型实现序列化器。 假设我有以下(大大简化的)模型:

class Operative(models.Model):
    name = models.CharField(max_length=256, blank=False)    
    email = models.EmailField(unique=True, null=True)
    desiganation = models.PositiveSmallIntegerField(default=0, choices=((0, 'Operative'), (1, 'Manager'), (2, 'Owner')))


class Task(models.Model):
    title = models.CharField(max_length=256, blank=False)
    manager = models.ForeignKey(Operative, null=True,on_delete=models.SET_NULL)
    operatives = models.ManyToManyField(Operative, blank=True)
    deadline = models.DateTimeField(null=True, blank=True)

现在,如果我有这样的序列化器:

class TaskSerializer(ModelSerializer):

    class Meta:
        model = Task
        fields = ('id', 'title', 'manager', 'operatives', 'deadline')
        read_only_fields = ('id',)

处理经理和操作员的包含整数ID的更新请求的最佳方法是什么? 更新API将接收包含json数据的POST请求,如下所示:

{
    "id": 1002,
    "title": "Task1",
    "deadline": "2018-09-15T15:53:00+05:00",
    "manager": 55,
    "operatives": [102, 110, 324]
}

我想为外键和序列化程序中的许多字段实现定制的逻辑。 目前,我在View中使用一些辅助方法来获取/设置操作员和经理的ID,这似乎有点笨拙。

以下内容不起作用吗?

class TaskSerializer(ModelSerializer):

    manager = serializers.PrimaryKeyRelatedField()
    operatives = serializers.PrimaryKeyRelatedField(many=True)

    class Meta:
        model = Task
        fields = ('id', 'title', 'manager', 'operatives', 'deadline')
        read_only_fields = ('id',)

ModelSerializer处理外键和多对多关系。 您应该重写create(self, validated_data)update(self, instance, validated_data)方法,以自定义保存和处理数据。