我正在使用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_purpose
和version_tag
的字符串,该字符串可以正常工作。
不起作用的是,当我拨打post
时,即当我想使用cloned_from
创建新版本时,它是通过字符串clone_from=None
创建的。我不知道为什么返回None
对象时它仍然是Version
。
任何人都可以帮忙吗?
答案 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
??♂️
现在,我添加了它,并且可以正常工作...