繁体   English   中英

Django Rest 框架在带有源的foreignKey上有一个to_representation

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM