查询Django中的子查询

时间:2011-11-21 19:36:15

标签: django django-models django-views

我正在尝试从另一个查询执行查询,但Django说:'渲染时捕获了DatabaseError:子查询返回的行数超过1行。我正在使用PostGis。

我的模特

class Place(models.Model):    
    coordinate = models.PointField()

class TranslatedPlace(models.Model):
    place = models.ForeignKey(Place)

我的观点

  near_coordinates = Place.objects.filter(coordinate__distance_lte=(place_obj.coordinate, D(km=100)))
  near_places = TranslatedPlace.objects.filter(place=near_coordinates)

2 个答案:

答案 0 :(得分:6)

我相信您会希望使用in来过滤第二个查询集

near_coordinates = Place.objects.filter(coordinate__distance_lte=(place_obj.coordinate, D(km=100)))
near_places = TranslatedPlace.objects.filter(place__in=near_coordinates)

答案 1 :(得分:3)

如果Place.objects.filter(coordinate__distance_lte=(place_obj.coordinate, D(km=100)))支持返回多个对象,您可以使用near_places = TranslatedPlace.objects.filter(place__in=near_coordinates)注意__in作为地点字段。如果您只应该获得一个而且只有一个,那么您可以.get()代替.filter()。如果数据库中有多个,但您只想获得一个,则可以.filter(...)[0]获取第一个。另外,如果你想根据某些排序获得第一个,你可以.filter(...).order_by('sort_field')[0]