【问题标题】:Custom behaviour of RelatedField while Serialization序列化时相关字段的自定义行为
【发布时间】:2016-02-23 07:36:35
【问题描述】:

我在下面有两个具有外键关系的模型。

class City(TimeStampedModel):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False)
    long_name = models.CharField(max_length=200)
    short_name = models.CharField(max_length=200)

class Address(TimeStampedModel):
         address_object = GenericForeignKey('address_content_type', 'object_id')
    address1 = models.CharField(max_length=200)
    address2 = models.CharField(max_length=200, null=True)
    landmark = models.CharField(max_length=200, null=True)
    city = models.ForeignKey(City, related_name='address_city')

我在下面为地址定义了序列化程序

class CityRelation(serializers.RelatedField):
    def to_representation(self, value):
        if isinstance(value, City):
            return CitySerializer(value).data

class AddressBookSerializer(serializers.ModelSerializer):
    city = CityRelation(read_only=True)

    class Meta:
        model = Address
        fields = ('id', 'uuid', 'address1', 'address2', 'landmark', 'city')
    @atomic
    def create(self, validated_data):
        address_book = Address(**validated_data)
        address_book.save()
        return address_book

    def update(self, instance, validated_data):
        instance.address1 = validated_data['address1']
        instance.address2 = validated_data['address2']
        instance.landmark = validated_data['landmark']
        instance.city = validated_data['city']
        instance.save()
        return instance

在这里,在反序列化时,我只想传递 JSON 中的 city_id,但在序列化时,我想要完整的城市对象......所以我覆盖了相关字段......但我在反序列化中遇到错误。我还尝试覆盖 to_internal_value() 方法,但在反序列化期间没有调用它。我该怎么做??

【问题讨论】:

  • 试试 PrimaryKeyRelatedField。什么错误?
  • @CarltonGibson "to_internal_value()" 方法没有被调用...我调试上面的代码并且它没有去那里..

标签: python django serialization django-rest-framework deserialization


【解决方案1】:

我解决了...实际上我将readonly=True 设置为城市关系,但只读to_representation() 被调用而不是to_internal_value()...所以我通过了查询集...

【讨论】:

    猜你喜欢
    • 2017-02-04
    • 2017-05-23
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2010-11-27
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多