0

Мне нужно начать говорить, что ни одно из решений, представленных в подобном вопросе, похоже, не работает для меня.Как правильно вставлять сериализаторы в Django REST Framework?

У меня есть две модели

class Building(models.Model): 
    (...) 
    address = models.ForeignKey('common.Address', null=True) 

class Address (models.Model): 
    (...) 
    latlng = models.PointField(null=True) 

Я использую Django REST Framework (с расширением addidtional ГИС) сериализаторов сериализовать эти модели:

class BuildingSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Building 

class AddressSerializer(serializers.GeoModelSerializer): 
    class Meta: 
     model = Address 

С умолчанию сериализаторов я получаю JSON выглядит как это:

results": [ 
     { 
      (...) 
      "address": 1 
     } 
    ] 

И желаемый JSON будет выглядеть так:

results": [ 
      { 
       (...) 
       "address": 1, 
       "latlng": { 
        "type": "Point", 
        "coordinates": [ 
         11.0, 
         11.0 
        ] 
       }, 
      }, 
     ] 

Где latlng это поле с адреса, в здании которого может быть только один.

Используя этот http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects броски и ошибки:

Got AttributeError when attempting to get a value for field `latlng` on serializer `BuildingSerializer`. 
The serializer field might be named incorrectly and not match any attribute or key on the `Building` instance. 
Original exception text was: 'Building' object has no attribute 'latlng'. 

ответ

2

Самый простой подход должен был бы добавить LatLng поле в сериализатором Building и реализовать способ его получения:

class BuildingSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Building 

    latlng = serializers.SerializerMethodField() 

    def get_latlng(self, obj): 
     if obj.address and obj.address.latlng: 
      return { 
       "type": obj.address.latlng.geom_type, 
       # any other fields in latlng 
      } 
+0

Спасибо, что работает отлично! Хотя, у меня есть еще один вопрос. Я использую rest_framework_gis GeoModelSerializer в адресе для сериализации точки как GeoJson. В этом случае мне нужно написать это сам взамен. Я что-то делаю неправильно, или GeoModelSerializer просто не способен сериализовать поля? Я получаю '<Объект точки в 0x7f09332779a0> не является сериализуемым JSON' при попытке вернуть plain latlng с помощью GeoModelSerializer. – user3146472

+0

Вместо этого попробуйте использовать GeoFeatureModelSerializer. –

+0

Он бросает «класс Meta не имеет атрибута« geo_field », который я действительно не знаю, как интерпретировать. – user3146472