8

私はこの2つのモデルを持っています。

class Store(models.Model):
    coords = models.PointField(null=True,blank=True)
    objects = models.GeoManager()

class Product(models.Model):
    stores  = models.ManyToManyField(Store, null=True, blank=True)
    objects = models.GeoManager()

ポイントまでの距離で商品を並べ替えたい。Product の stores フィールドが外部キーである場合、これを実行すると機能します。

pnt = GEOSGeometry('POINT(5 23)')
Product.objects.distance(pnt, field_name='stores__coords').order_by('distance')

しかし、フィールドはManyToManyフィールドであるため、壊れます

ValueError: <django.contrib.gis.db.models.fields.PointField: coords> is not in list

距離を計算するためにどのストアを使用する必要があるのか​​ はっきりしないため、これを期待していましたが、これを行う方法はありますか.

特定のポイントまでの距離で並べられた製品のリストが必要です。

4

3 に答える 3

0

これが私がそれを解決した方法ですが、私はこの解決策が本当に好きではありません。非常に非効率だと思います。GeoDjango にはもっと良い方法があるはずです。したがって、より良い解決策が見つかるまで、おそらくこれを使用することはありません。これが私がしたことです。

製品モデルに新しいメソッドを追加しました

class Product(models.Model):
    stores  = models.ManyToManyField(Store, null=True, blank=True)
    objects = models.GeoManager()

    def get_closes_store_distance(point):
        sorted_stores =  self.stores.distance(point).order_by('distance')
        if sorted_stores.count() > 0:
            store = sorted_stores[0]
            return store.distance.m
        return 99999999 # If no store, return very high distance

次に、この方法で並べ替えることができます

def sort_products(self, obj_list, lat, lng):
    pt = 'POINT(%s %s)' % (lng, lat)
    srtd = sorted(obj_list, key=lambda obj: obj.get_closest_store_distance(pt))
    return srtd

これを改善するためのより良い解決策や方法は大歓迎です。

于 2013-04-03T11:02:06.780 に答える