Пользовательское поле Django Rest Framework - PullRequest
1 голос
/ 29 февраля 2020

Я работаю над проектом местоположения и для бэкэнда использую Django Rest Framework с PostgreSQL. Я получаю объект запроса в следующем формате.

{"BatchId": 1, "GeoLocation": [{"latitude": 28.257999420166016, "longitude": 77.6415388}, {"latitude": 12.9562821, "longitude": 77.6415199}]}

Я хочу сохранить GeoLocation в строковом поле, поэтому я использую ($) для разделения элементов массива. Например: -

28.257999420166016**$**77.6415388

Я создал настраиваемое поле для этого, но оно показывает ошибку аннулирования.

model.py

class GeoLocation(models.Model):

    date = models.DateField()
    location = ArrayField(GeoLocationField())

GeoLocationField

class GeoLocationField(models.Field):
    def from_db_value(self, value, expression, connection):
        if value is None:
            return value
        return parse_location(value)
    def get_prep_value(self, value):
        return '$'.join([''.join(l) for l in (value.latitude,value.longitude)])

def parse_location(point_string):
    args = point_string.split('$')
    if len(args) != 2:
        raise ValidationError(_("Invalid input for a Location instance"))
    return Location(*args)


class Location:

    def __init__(self, latitude, longitude):
        self.latitude = latitude
        self.longitude = longitude

или есть другой способ хранения?

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

В качестве предложения вы можете сохранить его как json объект. PostgreSQL специфицировано c поля модели JSONField

сериализаторы:

    class LocationSerializer(serializers.Serializer):
        latitude = serializers.FloatField(read_only=True)
        longitude = serializers.FloatField(read_only=True)


    class  GeoLocationSerializer(serializers.ModelSerializer):
       location = LocationSerializer(many=True)

       class Meta:
           model = GeoLocation
           fields = [date, location]

модель:

    class GeoLocation(models.Model):
       date = models.DateField()
       location = JSONField()
0 голосов
/ 03 марта 2020

Использование Json Поле

Serializer.py

class JSONSerializerField(serializers.Field):
    """ Serializer for JSONField -- required to make field writable"""

    def to_internal_value(self, data):
        return data

    def to_representation(self, value):
        return value

class GeoLocationSerializer(serializers.ModelSerializer):
    location = JSONSerializerField()

    class Meta:
        model = models.GeoLocation
        fields = ['id', 'location', 'date']

Model.py

class GeoLocation(models.Model):
    date = models.DateField(default=datetime.date.today)
    location = JSONField()
    entered_user = models.ForeignKey(User, on_delete=models.PROTECT, related_name='+')
...