2011-01-11 11 views
1

次のように私はモデルを持っている:Django:ビュー内にQuerySetを作成しますか?

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)は背面の場所のクエリセットを取得するために、よりエレガントな方法でこれを行うことができます(b)私のビュー内のリストではなくQuerySetを作成していますか?

ありがとうございました!

答えて

1

このように、placesは標準のリストであり、QuerySetではなく、collectはGeoDjangoのQuerySets上にのみ存在するメソッドです。

あなたは二重アンダースコアの構文との関係に従って、一度に全部のクエリを行うことができるはず:Manor.placeフィールド上related_name="place"の使用は非常に混乱して

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

注 - これは逆のアトリビュートをManorに戻すように設定する理由は、manorsとする必要があります。

関連する問題