【问题标题】:Unable deserialize non-model field in modelSerializer in DRF3无法反序列化 DRF3 中 modelSerializer 中的非模型字段
【发布时间】:2019-07-11 11:43:20
【问题描述】:

这个问题可能看起来多余,但我已经搜索了其他答案,但他们似乎没有解决问题。我正在使用带有 DRF3 的 GeoDjango。我的模型中有一个名为 location 的字段,其值作为 Point 实例给出,它以经度和纬度作为参数。

因此,在序列化程序中,我有两个非模型字段 - 纬度和经度。但是,当我打印 validated_data 时,lat 和 lng 并没有反序列化。

更新

我已经删除了 latitudelongitudeserialzerMethodField 并用 location 字段替换它们,就像我在我的模型中一样。

models.py

class Site(models.Model):
    site_id = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="site")

    location = models.PointField(geography=True, null=True, blank=True)
    area = models.FloatField(null=True)
    objects = SiteManager()

managers.py

class SiteManager(BaseManager):
    use_in_migrations = True

    def create(self, owner, **kwargs):
        print('kwargs is ',kwargs)
        site = self.model(
            owner = owner,
            area = kwargs['area'],
            location=Point(float(kwargs['location']['latitude']), float(kwargs['location']['longitude'])),
        )

        site.save(using=self._db)

        print('site is ',site)

        return site

序列化器.py

class SiteSerializer(serializers.ModelSerializer):

    class Meta:
        model = Site
        fields = ('location', 'area')


# Serializer to get user details
class UserSiteSerializer(serializers.ModelSerializer):
    site = SiteSerializer()

    class Meta:
        model = User
        fields = ('fullName', 'email', 'site')

    def create(self, validated_data):
        site_data = validated_data.pop('site')
        user = InterestedUser.objects.create(**validated_data)
        Site.objects.create(owner=user, **site_data)
        return user

请求数据为:
{'fullName': 'rtyhgf', 'email': '8sdfggfs@er.com', 'site': {'location': {'longitude': 72.81919139881033, 'latitude': 18.925400020910235}, 'area': 636.865234375}

当我在UserSiteSerializercreate 方法中打印site_data 时,我得到OrderedDict([('area', 636.865234375)])

【问题讨论】:

  • return validated_data['latitude'] 而不是 print(validated_data['latitude'])?
  • @waynetech 我试过了,但没用。目前,我正在尝试删除serializerMethod 字段并将其替换为fields 中的位置。在repr 中,它给了我modelField 的字段。但是,现在我收到了AttributeError: 'RelatedManager' object has no attribute 'location'

标签: django django-rest-framework geodjango


【解决方案1】:

SerializerMethodField 用于只读字段。你应该这样写你的序列化器。

class SiteSerializer(serializers.ModelSerializer):
    latitude = serializers.FloatField(source='get_latitude')
    longitude = serializers.FloatField(source='get_longitude')

    def get_latitude(self, validated_data):
        print(validated_data['latitude'])

    def get_longitude(self, validated_data):
        print(validated_data['longitude'])

    class Meta:
        model = Site
        fields = ('latitude', 'longitude', 'area')

【讨论】:

    猜你喜欢
    • 2015-04-04
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多