1

半径100マイル以内Recordsにあるを見つけたいです。tag独立して動作する 2 つのクエリがありますが (以下を参照)、それらを組み合わせる方法がわかりません。

また、モデルには、 というモデルRecordsを指す外部キーがあります。モデルと) の両方のフィールドをワンショットで表示できるようにしたい。以下のクエリを試してみましたが、何らかの理由でモデル フィールドのみが表示され、追加のモデル フィールドは表示されません。GeoLocationgeo_location(RecordsGeoLocation.select_related()GeoLocationGeoLocationRecords

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フィールドにはdjango-taggitを使用しています。Records

4

1 に答える 1

2

ここには 2 つの問題があります。

まず、何が何をするのか誤解してselect_related()います。関連モデルのフィールドを現在のモデルに持ち込むことはありません。代わりに、関連するインスタンスをプリフェッチするだけなので、これを実行してmodel_instance.foreignkey_field.field_on_related_modelも別のデータベース ヒットは発生しません。

第二に、あなたのモデルは、外部キーについて最初に言ったことと矛盾しています。あなたはそれが GeoLocation から Records へだったと言いましたが、モデル定義はそれが逆であることを示しています。select_relatedその方向では機能しません。現在のモデルを考えると、GeoLocation を照会して関連するレコードを一度に取得する方法はありません。ただし、レコードをクエリして、関連する GeoLocations を取得することはできます。

(第三に、単一要素ルックアップの使用に関する私のコメントに対するあなたの答えinはまったく無関係です。を使用してくださいtags_slug=tag。)

于 2011-09-28T14:24:45.477 に答える