我有这两个模型。

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()

我想要按到点的距离对产品进行排序。如果“产品”中的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

我有点期待,因为目前尚不清楚应该使用哪个商店来计算距离,但是有什么办法可以做到这一点。

我需要按到特定点的距离订购的产品 list 。

最佳答案

只是一个想法,也许对您有用,这应该只需要两个数据库查询(由于预取是如何工作的)。如果它不起作用,请不要苛刻,我还没有尝试过:

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, through='ProductStore')
    objects = models.GeoManager()

class ProductStore(models.Model):
    product = models.ForeignKey(Product)
    store = models.ForeignKey(Store)
    objects = models.GeoManager()

然后:
pnt = GEOSGeometry('POINT(5 23)')
ps = ProductStore.objects.distance(pnt, field_name='store__coords').order_by('distance').prefetch_related('product')
for p in ps:
    p.product ... # do whatever you need with it

关于django - 使用相关的ManyToMany字段按距离排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15484768/

10-15 11:19