2010-10-01 30 views
7

Tengo el siguiente en mi models.py:cómo devolver varios objetos relacionados con ForeignKey en 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) 

me gustaría volver a la consulta de objetos relacionados con un determinado "Administrador". El problema es que el usuario puede agregar/eliminar tantos gerentes como quiera. Así que mi idea inicial era tener en mi views.py algo como esto:

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

Entonces, ¿cómo puedo devolver varios objetos? Al igual que si el usuario agrega otro "Administrador" obtendré un tercer conjunto en mi views.py.

Respuesta

12

Se pueden realizar consultas sobre related objects así:

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

En su plantilla, también puede simplemente acceder al hostdata_set directamente:

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

Creo que esto es lo que estás pidiendo.

Por cierto, si su modelo Managers almacena datos sobre un solo "Administrador", puede que le resulte útil cambiar su nombre al singular Manager.

+0

Gracias! Esto es lo que estaba buscando. Solo una nota: los paréntesis no se usan en las etiquetas de plantilla, así que en la plantilla debe ser: manager.hostdata_set.all –

+0

Gracias, eso fue un error de copiar y pegar, creo. – Seth

+0

Gracioso ... terminé necesitando el * exacto * lo mismo ahora. Gracias Seth. –

0

Creo que (tal vez ??) que busca algo como ...

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

A continuación, puede hacer un bucle dentro de la vista?

No estoy exactamente tan seguro de que esto funcione, pero avíseme si ayuda.

0

Sólo tiene que añadir datos de host conjuntos dinámicamente al contexto de la plantilla:

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

Luego, en su plantilla que puede iterar sobre los conjuntos de datos:

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

Parece que desea pedir al HostData para devolver todos los objetos que están relacionados con un determinado administrador. Si es así, entonces debe conocer una información única sobre el administrador determinado que está buscando.

Por el bien del argumento, asumamos que el Director de "Identificación" se utiliza como clave principal y por lo tanto única y que están buscando una id = 5.

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