在Django Rest Framework中序列化相关模型

时间:2018-03-22 00:17:48

标签: python django django-rest-framework

我的django模型简化为:

class Client(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class ClientDetail(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    business_format = models.CharField(max_length=255)


    def __str__(self):
        return "Details for {}".format(self.client.name)


class ClientAssignment(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    assignment = models.ForeignKey(Assignment, on_delete=models.CASCADE)


    def __str__(self):
        return "Assignment: {} for Client: {}".format(self.assignment.name, self.client.name)

class Assignment(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

我正在使用django-rest-framework,并希望创建一个视图,我可以在其中提供client_id并接收包含所有3个相关模型的序列化对象。我尝试使用PrimaryKeyRelatedField如下,但我不确定我是否正确使用它。

class CompleteClientObject(ModelSerializer):
    assignment = PrimaryKeyRelatedField(many=True, queryset=ClientAssignment.objects)
    detail = PrimaryKeyRelatedField(many=True, queryset=ClientDetail.objects)
    client = PrimaryKeyRelatedField(queryset=Client)

    class Meta:
        model = Client
        fields = ("id", "name", "detail", "assignment",)

如何使用序列化器实现此目的?

1 个答案:

答案 0 :(得分:4)

在序列化程序字段中,您可以使用source参数指定模型上的字段。如果您尝试从客户端模型访问反向关系,则应使用MODELNAME_set字段作为源。 Django将此字段添加到ForeignKey的另一端。即。

assignment = PrimaryKeyRelatedField(
    source='clientassignment_set',
    many=True,
    read_only=True,
)

请注意,使用read_only=True时,您也不需要指定查询集。

您的另一个选择是在ForeignKey上指定一个related_name字段,该字段会覆盖MODELNAME_set自动生成的字段,并将其设置为“赋值”和“详细信息”。