Использование модели GeoDjango в качестве абстрактного класса - PullRequest
1 голос
/ 24 октября 2011

Я играю с GeoDjango и у меня есть некоторые сомнения.Я буду очень признателен за любые комментарии и предложения.

Это моя проблема.Во-первых, я определил этот (абстрактный) класс:

from django.contrib.gis.db import models
from django.contrib.gis.geos import *

class LocatableModel(models.Model):
    country = models.CharField(max_length=48, blank=True)
    country_code = models.CharField(max_length=2, blank=True)
    locality = models.CharField(max_length=48, blank=True)
    sub_locality = models.CharField(max_length=48, blank=True)
    street = models.CharField(max_length=48, blank=True)
    address = models.CharField(max_length=120, blank=True)
    point = models.PointField(null=True)
    objects = models.GeoManager()

    class Meta:
        abstract = True

Во-вторых, я определил этот другой класс «Entity», который представляет человека или организацию, связанную с моим сайтом:

from django.db import models

class Entity(models.Model):
    name = models.CharField(max_length=64)
    slug = models.SlugField(max_length=64, unique=True)
    website = models.URLField(verify_exists=False, blank=True)
    email = models.EmailField(blank=True)
    ... 

Наконец, я создал класс из предыдущих:

import LocatableModel
import Entity

class Organization(Entity, LocatableModel):
    timetable = models.CharField(max_length=64)
    ... 

На мой взгляд, я хотел бы найти организации рядом с определенной точкой:

from django.contrib.gis.geos import Point
from django.contrib.gis.measure import D

def index(request):
    pnt = Point(12.4604, 43.9420)
    dic = { 'orgs': Organization.objects.filter(point__distance__lte=(pnt, D(km=7))) }
    return render_to_response('index.html', dic)

Но я получаю сообщение об ошибке:

«Присоединение к полю« точка »не разрешено. Вы неправильно написали« расстояние »для типа поиска?»

Мне кажется, я путаюсь ссвойство модели 'objects', но я не уверен.Есть идеи?Заранее спасибо.

1 Ответ

3 голосов
/ 09 декабря 2011

Эта ошибка была замечена ранее и утверждается, что она исправлена ​​в этом тикете 3 года назад

https://code.djangoproject.com/ticket/9364

Когда я столкнулся с этой же проблемой, я заметил в заявке, что диспетчер запросов был явно установлен в GeoManager в унаследованных моделях. Таким образом, добавление строки, как,


class Organization(Entity, LocatableModel): 
    timetable = models.CharField(max_length=64)
    ...
    objects = models.GeoManager()

... может решить проблему, с которой вы столкнулись, у меня сработало.

...