Невозможно десериализовать немодельное поле в modelSerializer в DRF3 - PullRequest
0 голосов
/ 11 июля 2019

Этот вопрос может показаться излишним, но я искал другие ответы, и они, похоже, не решили проблему.Я использую GeoDjango с DRF3.В моих моделях есть поле с именем location, значение которого задано как экземпляр Point, который принимает долготу и широту в качестве аргумента.

Поэтому в сериализаторе у меня есть два немодельных поля - широта и долгота.Однако, когда я печатаю validated_data, lat и lng не десериализованы.

Обновление

Я удалил serialzerMethodField для latitude и longitude и заменил ихс полем 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()

Manager.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

serializers.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}

когда я печатаю site_data в create методе UserSiteSerializer, я получаю OrderedDict([('area', 636.865234375)])

1 Ответ

0 голосов
/ 12 июля 2019

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')
...