Django: создать QuerySet внутри представления? - PullRequest
1 голос
/ 11 января 2011

У меня есть следующие модели:

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'

Могу ли я (а) сделать это более элегантным способом, чтобы получитьQuerySet мест назад, или (б) создать QuerySet, а не список на мой взгляд?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 11 января 2011

Как вы это делаете, places - это стандартный список, а не QuerySet, а collect - это метод, который существует только в GeoDjango QuerySets.

Вы должны иметь возможность выполнить весь запрос за один раз, следуя отношениям с синтаксисом двойного подчеркивания:

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

Обратите внимание, что использование related_name="place" в поле Manor.place очень запутанно - это то, что устанавливает атрибут reverse из Place обратно в Manor, поэтому он должен называться manors.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...