Django - несколько запросов в один - PullRequest
1 голос
/ 28 сентября 2011

Я хочу найти Records с определенным tag в радиусе 100 миль.У меня есть два запроса, которые работают независимо (см. Ниже), но я не знаю, как их соединить.

Также модель Records имеет внешний ключ, указывающий на модель GeoLocation, которая называется geo_location.Я хочу иметь возможность показывать поля из обеих моделей (Records и GeoLocation) в одном кадре.Я попытался использовать .select_related() в запросе GeoLocation, указанном ниже, но по какой-то причине мне удалось показать только поля модели GeoLocation, а не дополнительные поля модели Records, как я ожидал.

tag_search = Records.objects.filter(tags__slug__in=[tag])
geo_search = GeoLocation.objects.select_related().filter(srid2163__distance_lte=(pnt, D(mi=100))).distance(pnt)

Есть идеи?


Это мои модели:

from taggit.managers import TaggableManager
from django.contrib.gis.db import models

class GeoLocation (models.Model):
    lat = models.FloatField(blank=True)
    long = models.FloatField(blank=True)
    srid2163 = models.PointField(blank=True,srid=2163)
    server_time = models.DateTimeField(auto_now_add=True)

    objects = models.GeoManager()

    def __unicode__(self):
        return u'%s %s %s' % (self.lat, self.long, self.server_time)


class Records(models.Model):
    title = models.CharField(blank=True, max_length=50)
    message_body = models.TextField()
    server_time = models.DateTimeField(auto_now_add=True)
    geo_location = models.ForeignKey(GeoLocation, related_name='geoloc')


    tags = TaggableManager()

    def __unicode__(self):
        return u'%s %s %s' % (self.title, self.message_body, self.server_time)

Для поля tags в модели Records, которую я использую django-taggit .

1 Ответ

1 голос
/ 28 сентября 2011

Здесь две вещи не так.

Во-первых, вы неправильно поняли, что делает select_related().Он не переносит поля из связанной модели в текущую.Вместо этого он просто предварительно выбирает связанный экземпляр, так что выполнение model_instance.foreignkey_field.field_on_related_model не вызывает повторного попадания в дб.

Во-вторых, ваши модели противоречат тому, что вы изначально говорили об иностранном ключе.Вы сказали, что это от GeoLocation до Records, но определения моделей показывают, что это наоборот.select_related не работает в этом направлении - с учетом ваших текущих моделей нет способа запросить GeoLocation и получить соответствующие записи за один раз.Тем не менее, вы можете запрашивать записи и получать соответствующие геолокации.

(В-третьих, ваш ответ на мой комментарий об использовании одноэлементного поиска in совершенно не имеет значения. Использование tags_slug=tag.)

...