![](/img/trans.png)
[英]Django Rest Framework 3.0 to_representation not implemented
[英]Django Rest Framework have a to_representation on a foreignKey with source
我在一个键上有一个嵌套关系,该键的名称与数据库中键的名称不同。 我可以两者都做,只是如果它们结合起来就不行。
我需要 api 名称为countryOfOrigin
,来源为country_of_origin
。
然而,我唯一能去工作的是
[
{
"articleIdOwn": "1234abc",
"articleNameOwn": "1234abc",
"countryOfOrigin": "DE"
}
]
序列化程序如下所示:
class ProductSerializer(serializers.ModelSerializer):
articleIdOwn = serializers.CharField(source='article_id_own')
articleNameOwn = serializers.CharField(source='article_name_own')
countryOfOrigin = serializers.PrimaryKeyRelatedField(source='country_of_origin', read_only=True)
class Meta:
model = User_Product
fields = ['articleIdOwn', 'articleNameOwn','countryOfOrigin']
或这个:
[
{
"articleIdOwn": "1234abc",
"articleNameOwn": "1234abc",
"country_of_origin": {
"isoCode": "DE",
"country": "Deutschland"
}
}
]
序列化程序如下所示:
class HS_CountriesSerializer(serializers.ModelSerializer):
isoCode = serializers.CharField(source='iso_code', read_only=True)
country = serializers.CharField(read_only=True)
class Meta:
model = HS_Countries
fields = ['isoCode', 'country']
class ProductSerializer(serializers.ModelSerializer):
articleIdOwn = serializers.CharField(source='article_id_own')
articleNameOwn = serializers.CharField(source='article_name_own')
class Meta:
model = User_Product
fields = ['articleIdOwn', 'articleNameOwn', 'country_of_origin']
def to_representation(self, instance):
self.fields['country_of_origin'] = HS_CountriesSerializer(read_only=True)
return super().to_representation(instance)
但是我希望它看起来像这样:
[
{
"articleIdOwn": "1234abc",
"articleNameOwn": "1234abc",
"countryOfOrigin": {
"isoCode": "DE",
"country": "Deutschland"
}
}
]
产品和国家的模型
class User_Product(models.Model):
key = models.CharField(max_length=10)
code = models.ForeignKey('HS_Code', on_delete=models.CASCADE, null=True)
article_id_own = models.TextField()
article_name_own = models.TextField()
country_of_origin = models.ForeignKey(
'HS_Countries', on_delete=models.CASCADE, null=False)
class HS_Countries(models.Model):
iso_code = models.CharField(primary_key=True, max_length=2)
country = models.CharField(max_length=255)
您可以使用HS_CountriesSerializer
来获得您想要的。
class HS_CountriesSerializer(serializers.ModelSerializer):
isoCode = serializers.CharField(source='iso_code', read_only=True)
country = serializers.CharField(read_only=True)
class Meta:
model = HS_Countries
fields = ['isoCode', 'country']
class ProductSerializer(serializers.ModelSerializer):
articleIdOwn = serializers.CharField(source='article_id_own')
articleNameOwn = serializers.CharField(source='article_name_own')
# add the following line and use it in your fields
countryOfOrigin = HS_CountriesSerializer(read_only=True)
class Meta:
model = User_Product
fields = ['articleIdOwn', 'articleNameOwn', 'countryOfOrigin']
如果您的目标是将您的字段从蛇形案例更改为 API 的骆驼案例,那么您应该使用djangorestframework-camel-case ,这将帮助您避免在序列化程序中重写字段以更改字段的大小写。
安装 djangorestframework-camel-case 后,您可以执行以下操作:
class HS_CountriesSerializer(serializers.ModelSerializer):
class Meta:
model = HS_Countries
fields = ['iso_code', 'country']
class ProductSerializer(serializers.ModelSerializer):
country_of_origin = HS_CountriesSerializer(read_only=True)
class Meta:
model = User_Product
fields = ['article_id_own', 'article_name_own', 'country_of_origin']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.