Установить сериализатор geo_field как PointField от другой модели - Django

У меня две модели и нужно сериализовать Article как Geojson, установив geo_field приписывать как point от Location модель. Следуя приведенному здесь решению, я получаю сообщение об ошибке:

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

Вот мои модели:

class Location(models.Model):
    city = models.CharField(max_length=200)
    point = models.PointField(srid=4326)
    objects = models.GeoManager()

class Article(models.Model):
    locations = models.ManyToManyField(Location)
    article_title = models.CharField(max_length=200)

    @property
    def point(self):
    return self.locations.point

И мой сериализатор:

class ArticleSerializer(GeoFeatureModelSerializer):
point = GeometryField()

class Meta:
    model = Article
    geo_field = "point"
    id_field = False
    fields = ('pub_date', 'point',)

Любая помощь приветствуется. Я пытался найти решение этой проблемы целую вечность с небольшим успехом!

ОБНОВИТЬ!

Хорошо, доберись куда-нибудь с этим. Я создал LocationSerializer и ссылаться на это в ArticleSerializer, Теперь они выглядят примерно так:

class LocationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Location
        geo_field = "point"
        id_field = False
        fields = ('point',)

class ArticleSerializer(GeoFeatureModelSerializer):
    locations = LocationSerializer(many=True)       
    class Meta:
        model = Article
        geo_field = "locations"
        id_field = False
        fields = ('pub_date', 'locations',)

Вывод ближе к тому, что я хочу... но все же немного неясен по конструкции:

{  
    "type":"FeatureCollection",
    "features":[  
        {  
            "type":"Feature",
            "geometry":[  
                {  
                    "point":{  
                        "type":"Point",
                        "coordinates":[  
                            -2.200337956118645,
                            53.48316423741371
                        ]
                    }
                },
                {  
                    "point":{  
                        "type":"Point",
                        "coordinates":[  
                            0.041198730463564,
                            51.51002453017606
                        ]
                    }
                }
            ],
            "properties":{  
                "pub_date":"2015-04-06T20:38:59Z"
            }
        }
    ]
}

ОБНОВИТЬ!

Формат мне нужен:

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {
                "time": "2013-01-22 08:42:26+01"
            },
            "geometry": {
                "type": "Point",
                "coordinates": [
                    7.582512743,
                    51.933292258,
                    1
                ]
            }
        },

2 ответа

Проблема в том, что ваш point собственность на Article модель имеет в виду self.locations который является ManyToManyField, Ты звонишь self.locations.point как будто self.locations это ForeignKey вот почему вы получаете свою ошибку.

Объект "ManyRelatedManager" не имеет атрибута "точка".

Значит это self.locations возвращает ManyRelatedManager, что имеет смысл для ManyToManyField, Поскольку вы ожидаете только один объект, это означает, что вам нужно сделать одно из двух изменений

  1. Вы действительно хотели иметь locations быть ForeignKey, что будет означать ваш point свойство правильно.
  2. Вы на самом деле ожидаете несколько мест для Article, и ваш point свойство на самом деле должно возвращать список точек.

    return [location.point for location in self.locations]
    

Если вы на самом деле ищете несколько мест, вы также хотите установить many=True на ваше GeometryField на вашем сериализаторе.

Хорошо, решение похоже... не делай так, как я пытался. Я обошел большую часть проблемы, используя vectorformats.DjangoWStyle (просто поиск в Google), чтобы справиться с поиском геоджон из двух моделей. Кроме того, попытка обратного отношения к достижению этого приведет к миру страданий. Вместо этого я добавил ManyToManyField на Location модель, ссылаясь на Article модель.

Другие вопросы по тегам