2011-01-11 5 views
1

J'ai modèles suivants:Django: construit un QuerySet dans une vue?

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") 

Je veux tous les lieux attachés à la relation « seigneur » à une personne, puis obtenir le centre, en utilisant une méthode GeoDjango. Ceci est aussi loin que j'ai:

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 

Cependant, cela me donne:

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

Puis-je (a) faire d'une façon plus élégante pour obtenir un QuerySet des lieux de retour directement, ou (b) construire un QuerySet plutôt qu'une liste dans ma vue?

Merci pour votre aide!

Répondre

1

La façon dont vous faites cela, places est une liste standard, pas un QuerySet, et collect est une méthode qui n'existe que sur GeoDjango QuerySets.

Vous devriez être en mesure de faire toute requête en une seule fois en suivant les relations avec la syntaxe double underscore:

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

Notez que votre utilisation de related_name="place" sur le terrain Manor.place est très déroutant - c'est ce qui définit l'attribut reverse de Place à Manor, il devrait donc s'appeler manors.