Установить сериализатор 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
, Поскольку вы ожидаете только один объект, это означает, что вам нужно сделать одно из двух изменений
- Вы действительно хотели иметь
locations
бытьForeignKey
, что будет означать вашpoint
свойство правильно. Вы на самом деле ожидаете несколько мест для
Article
, и вашpoint
свойство на самом деле должно возвращать список точек.return [location.point for location in self.locations]
Если вы на самом деле ищете несколько мест, вы также хотите установить many=True
на ваше GeometryField
на вашем сериализаторе.
Хорошо, решение похоже... не делай так, как я пытался. Я обошел большую часть проблемы, используя vectorformats.DjangoWStyle (просто поиск в Google), чтобы справиться с поиском геоджон из двух моделей. Кроме того, попытка обратного отношения к достижению этого приведет к миру страданий. Вместо этого я добавил ManyToManyField
на Location
модель, ссылаясь на Article
модель.