Django:在视图中构造一个QuerySet?

时间:2011-01-11 13:29:25

标签: django

我的模型如下:

class Place(models.Model):
    name = models.CharField(max_length=300)  
class Person(models.Model):
    name = models.CharField(max_length=300) 
class Manor(models.Model):
    place = models.ManyToManyField(Place, related_name="place"))  
    lord = models.ManyToManyField(Person, related_name="lord")  
    overlord = models.ManyToManyField(Person, related_name="overlord")

我希望使用GeoDjango方法将所有与“主”关系附加的地方附加到特定的人,然后获取中心。就我而言:

person = get_object_or_404(Person, namesidx=namesidx)
manors = Manor.objects.filter(lord=person)
places = []
for manor in manors:
    place_queryset = manor.place.all()
    for place in place_queryset: 
        places.append(place)  
if places.collect():
    centre = places.collect().centroid

但是,这给了我:

AttributeError at /name/208460/gamal-of-shottle/
'list' object has no attribute 'collect'

我可以(a)以更优雅的方式直接获取场所的QuerySet,或者(b)在我的视图中构建QuerySet而不是列表吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您执行此操作的方式,places是标准列表,而不是QuerySet,collect是仅存在于GeoDjango QuerySet上的方法。

您应该能够通过遵循双下划线语法的关系一次完成整个查询:

places = Place.objects.filter(manor__lord=person)

请注意,您在related_name="place"字段上使用Manor.place非常容易混淆 - 这就是将反向属性从Place设置回庄园的原因,因此应该调用它manors