我对 Django 1.5.4 有问题。我把这个问题放在StackOverflow而不是 https://gis.stackexchange.com/因为我几乎100%确定不是与GIS相关的问题。
这是我的设置:
我的 models.py
from django.contrib.auth.models import User
from django.contrib.gis.db import models as gismodels
# This models a region of interest, using a polygon
class ROI(gismodels.Model):
label = models.CharField(max_length=256, default='ROI')
area = models.FloatField(default=0.0)
geom = gismodels.PolygonField(srid=4326)
when = models.DateTimeField(default=datetime.now())
user = models.ForeignKey(User, null=True)
objects = gismodels.GeoManager()
def __unicode__(self):
return unicode(self.label)
class Meta:
ordering = ['when']
class Indicator(models.Model):
name = models.TextField()
color = models.TextField()
measurement_units = models.CharField(max_length=100)
algorithm = models.CharField(max_length=256)
data_origin = models.TextField()
class Series(models.Model):
roi = models.ForeignKey(ROI)
indicator = models.ForeignKey(Indicator)
如您所见,序列模型包含对 ROI 模型的引用
我的 settings.py
SERIALIZATION_MODULES = {
'geojson': 'djgeojson.serializers'
}
我正在使用django-geojson将我的ROI对象序列化为GeoJSON。我想使用此序列化程序向我的客户端发送 GeoJSON。所以,我的 views.py 看起来像这样
我的 views.py
@login_required
def get_rois(request):
rois_query = ROI.objects.filter(user=request.user)
polygons = json.loads(serializers.serialize('geojson', rois_query))
return HttpResponse(json.dumps(polygons), mimetype='application/json')
问题:我在序列化调用中收到此错误
AttributeError: 'ROI' object has no attribute 'roi'
错误堆栈的相关部分是这个
File "/home/vagrant/.virtualenvs/myapp/local/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 122, in serialize
s.serialize(queryset, **options)
File "/home/vagrant/.virtualenvs/myapp/local/lib/python2.7/site-packages/djgeojson/serializers.py", line 349, in serialize
self.serialize_queryset(queryset)
File "/home/vagrant/.virtualenvs/myapp/local/lib/python2.7/site-packages/djgeojson/serializers.py", line 321, in serialize_queryset
self.handle_reverse_field(obj, field, field_name)
File "/home/vagrant/.virtualenvs/myapp/local/lib/python2.7/site-packages/djgeojson/serializers.py", line 243, in handle_reverse_field
values = [reverse_value(related) for related in getattr(obj, field_name).iterator()]
查看堆栈,似乎解析ROI
到Series
的反向引用时存在问题。 Series
有一个指向ROI
roi
字段,我认为序列化程序认为roi
字段属于类ROI
(不正确)而不是Series
(正确)。无限循环这个词浮现在我的脑海中。
此外,如果我从模型类中删除roi
字段Series
它可以工作
我不确定这是 django-geojson 插件的错误(使用最新版本)还是我的代码有问题(很可能)。我已经尝试使用默认的json序列化程序,但仍然收到相同的错误。并且还尝试从 gismodels 而不是模型继承所有模型类。没有效果。
有什么线索吗?
好的,我设法解决了它。看起来 django-geojson 插件中有一个错误。它无法处理落后的关系。所以,我只是告诉 Django 避免在 ROI
和 Series
之间建立反向关系
class Series(gismodels.Model):
# Prevents django to create a backwards relation between ROI and Series
roi = models.ForeignKey(ROI, related_name='+')
indicator = models.ForeignKey(Indicator)