【问题标题】:Django Rest Framework have a to_representation on a foreignKey with sourceDjango Rest Framework 在带有源的外键上有一个 to_representation
【发布时间】:2020-06-14 17:04:44
【问题描述】:

我在一个键上有一个嵌套关系,该键的名称与数据库中键的名称不同。 我可以两者都做,只是如果它们结合起来就不行了。

我需要 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)

【问题讨论】:

  • 显示产品和国家/地区的模型。

标签: django serialization django-rest-framework


【解决方案1】:

您可以使用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']

【讨论】:

  • 嘿,我添加了两个模型。
  • 哦,当我按照建议进行操作时。响应中未返回密钥 countryOfOrigin
猜你喜欢
  • 2015-06-29
  • 1970-01-01
  • 2016-03-15
  • 2017-06-03
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多