我的模型如下:
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而不是列表吗?
感谢您的帮助!
答案 0 :(得分:1)
您执行此操作的方式,places
是标准列表,而不是QuerySet,collect
是仅存在于GeoDjango QuerySet上的方法。
您应该能够通过遵循双下划线语法的关系一次完成整个查询:
places = Place.objects.filter(manor__lord=person)
请注意,您在related_name="place"
字段上使用Manor.place
非常容易混淆 - 这就是将反向属性从Place设置回庄园的原因,因此应该调用它manors
。