无法使用自定义序列化器反序列化自引用外键

时间:2020-10-15 16:13:58

标签: python django django-rest-framework

我正在使用django和django-rest-framework创建API

我有这样的模特

class Version(models.Model):
    version_tag = models.IntegerField(verbose_name=_("Version"))
    data = models.TextField(verbose_name=_("Data"))
    cloned_from = models.ForeignKey(
        "self", on_delete=models.SET_NULL, null=True, blank=True
    )
    endpoint = models.ForeignKey(
        ManagedEndpoint,
        verbose_name=_("Endpoint"),
        related_name="versions",
        related_query_name="version",
        on_delete=models.CASCADE,
    )

和这样的序列化器

class VersionSerializer(serializers.ModelSerializer):
    data = serializers.JSONField()
    version_tag = serializers.IntegerField(required=False)
    cloned_from = ClonedFromSerializer(required=False)
    resource_purpose = serializers.CharField(
        source="endpoint.resource_purpose", required=False
    )
    
    class Meta:
        model = models.Version
        fields = [
            "resource_purpose",
            "version_tag",
            "data",
            "cloned_from"
        ]

我有这样的自定义序列化器ClonedFromSerializer

class ClonedFromSerializer(serializers.Field):
    def to_representation(self, value):
        if value.endpoint is None:
            return ""
        return "%s : %s" % (value.endpoint.resource_purpose, value.version_tag)

    def to_internal_value(self, data):
        resource_purpose, version_tag = data.split(":")
        try:
            endpoint = models.ManagedEndpoint.objects.get(
                resource_purpose=resource_purpose.strip()
            )
            return models.Version.objects.get(
                endpoint=endpoint, version_tag=version_tag.strip()
            )
        except models.ManagedEndpoint.DoesNotExist:
            raise serializers.ValidationError(
                "invalid clone_from value passed"
            )

我想做的是,cloned_from应该输出包含resource_purposeversion_tag的字符串,该字符串可以正常工作。

不起作用的是,当我拨打post时,即当我想使用cloned_from创建新版本时,它是通过字符串clone_from=None创建的。我不知道为什么返回None对象时它仍然是Version

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

这是一个愚蠢的错误。我在create中覆盖了VersionSerializer方法,并创建了Version对象,像这样

return models.Version.objects.create(
                version_tag=_version_tag,
                data=validated_data.pop("data"),
                endpoint=endpoint_obj,
                is_active=True,
                created_by=self.context["request"].user,
            )

在这里,没有通过cloned_from ??‍♂️

现在,我添加了它,并且可以正常工作...