GeoDjango 序列化程序和外键字段出错



我对 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()]

查看堆栈,似乎解析ROISeries反向引用时存在问题。 Series有一个指向ROI roi字段,我认为序列化程序认为roi字段属于类ROI(不正确)而不是Series(正确)。无限循环这个词浮现在我的脑海中。

此外,如果我从模型类中删除roi字段Series它可以工作

我不确定这是 django-geojson 插件的错误(使用最新版本)还是我的代码有问题(很可能)。我已经尝试使用默认的json序列化程序,但仍然收到相同的错误。并且还尝试从 gismodels 而不是模型继承所有模型类。没有效果。

有什么线索吗?

好的,我设法解决了它。看起来 django-geojson 插件中有一个错误。它无法处理落后的关系。所以,我只是告诉 Django 避免在 ROISeries 之间建立反向关系

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)

最新更新