2010-10-01 12 views
7

Mam następujących w moim models.py:Jak wrócić wiele obiektów związanych z ForeignKey w Django

class HostData(models.Model): 
    Manager = models.ForeignKey(Managers) 
    Host = models.CharField(max_length=50, null=True) 
    HostStatus = models.CharField(max_length=200, null=True) 
    Cpu = models.PositiveIntegerField(max_length=10, null=True) 
    Disk = models.FloatField(null=True) 

Chciałbym zwrócić zapytanie do obiektów związanych z pewnym „Manager”. Problem polega na tym, że użytkownik może dodawać/usuwać tylu menedżerów, ile chce. Tak więc moją pierwszą myślą było mieć w moich views.py coś takiego:

def get_data(request): 
for server in Managers.objects.all(): 
    host_data = HostData.objects.filter(Manager=server) 
    # Lost after this :(
return render_to_response('mypage.html', {'first_set': host_data1, 'second_set': host_data2}) 

Jak mogę zwrócić wiele obiektów? Tak jak w przypadku, gdy użytkownik doda kolejny "Menedżer", dostanę trzeci zestaw w moim views.py.

Odpowiedz

12

Można zapytać o related objects tak:

manager = Managers.objects.get(pk=1) # identify which manager you want 
manager.hostdata_set.all() # retrieve all related HostData objects 

W szablonie, można też po prostu przejść hostdata_set bezpośrednio ze:

{% for manager in managers %} 
    {% for data in manager.hostdata_set.all %} 
     do something with {{ data }} 
    {% endfor %} 
{% endfor %} 

Wierzę, że to, co prosisz.

Nawiasem mówiąc, jeśli Twój model Managers przechowuje dane o pojedynczym "Menedżerze", może okazać się użyteczne, aby zmienić jego nazwę na pojedynczą Manager.

+0

dzięki! tego właśnie szukałem. Tylko uwaga: nawiasy nie są używane w znacznikach szablonów, więc w szablonie powinno być: manager.hostdata_set.all –

+0

Dziękuję, to był błąd kopiowania i wklejania. – Seth

+0

Śmieszne .. Skończyło się, że potrzebowałem * dokładnie * tej samej rzeczy właśnie teraz. Dzięki Seth. –

0

myślę (może być ??) szukasz czegoś jak ...

managers = Managers.objects.all() 
host_data = HostData.objects.filter(managers__in=managers) 

Następnie można zrobić pętlę wewnątrz widoku?

Nie jestem do końca pewien, czy to zadziała, ale daj mi znać, jeśli to pomoże.

0

Wystarczy dodać danych hosta zestawy dinamically do kontekstu szablonu:

def get_data(request): 
host_data_sets = [] 

for server in Managers.objects.all(): 
    host_data_set = HostData.objects.filter(Manager=server) 
    host_data_sets.append(host_data_set) 

return render_to_response('mypage.html', {'host_data_sets': host_data_sets}) 

Następnie w szablonie można iteracyjne nad zbiorami danych:

{% for host_data_set in host_data_sets %} 
    <!-- do something with host_data_set --> 
{% endfor %} 
2

Wydaje się, że chcesz zapytać HostData zwrócić wszystkie obiekty powiązane z określonym menedżerem. Jeśli tak, to powinieneś znać jedną unikalną informację o wybranym Menadżerze.

Dla argumentu, załóżmy, „ID” Manager jest używany jako klucz podstawowy, a więc niepowtarzalny i szukamy id = 5.

id = 5 
hostdata = HostData.objects.filter(Manager__id=id)