GeoDjango & MySQL: точки не могут быть NULL, какое еще «пустое» значение я должен использовать? - PullRequest
6 голосов
/ 03 ноября 2010

У меня есть эта модель Django:

from django.contrib.gis.db import models

class Event(models.Model):
    address = models.TextField()
    point = models.PointField('coordinates', null=True, blank=True)

Когда я синхронизирую эту модель с использованием MySQL, при создании индексов выводится это сообщение об ошибке:

Failed to install index for events.Event model: (1252, 'All parts of a SPATIAL index must be NOT NULL')

Итак, не имея возможности использовать null=True (учитывая, что я хочу получить этот индекс), какие еще возможности у меня есть? Я мог бы определить точку (0,0) как «пустую», но тогда я должен помнить, что соглашение везде, где я планирую использовать данные, в противном случае произойдет целый ряд событий где-нибудь в Атлантике к западу от Африки ...

Какие еще есть возможности?

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

Я не думаю, что у вас есть много вариантов здесь.Либо вы используете заполнитель, такой как (0, 0), либо инкапсулируете точку в объекте и ссылаетесь на объект везде, где вам нужна точка.Таким образом, ссылка на объект может быть обнуляемой, но дополнительное объединение ухудшит производительность и усложнит ситуацию.

0 голосов
/ 05 марта 2014

У меня просто была такая же проблема.Для меня мне нужно было указать, чтобы не делать пространственный_индекс.Таким образом, ваша модель изменится на:

from django.contrib.gis.db import models

class Event(models.Model):
    address = models.TextField()
    point = models.PointField('coordinates', null=True, blank=True, spatial_index=False)
0 голосов
/ 23 октября 2013

Быстрая идея состоит в том, чтобы иметь другое логическое поле, которое вы помечаете как истинное / ложное, когда у вас есть фактическая точка. Это упростит запрос, потому что вы можете добавить логическое поле в предложение where.

class Event(models.Model):
    ...
    has_point = models.BooleanField(default=False)
    point = models.PointField('coordinates', ...)

Event.objects.filter(has_point=True)...#whatever else you need when handling location
...