2010-10-01 10 views
7

Ho il seguente nel mio models.py:Come restituire più oggetti legati con ForeignKey in 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) 

Vorrei restituire la query per oggetti relativi a una certa "Manager". Il problema è che l'utente può aggiungere/eliminare tutti i gestori che desidera. Quindi il mio pensiero iniziale era quello di avere nel mio qualcosa di simile views.py:

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

Quindi, come posso tornare più oggetti? Come se l'utente aggiungesse un altro "Manager", otterrò un terzo set nel mio views.py.

risposta

12

È possibile eseguire una query su related objects in questo modo:

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

Nel modello, si può anche semplicemente accedere al hostdata_set direttamente:

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

Credo che questo è ciò che stai chiedendo.

Per inciso, se il modello Managers memorizza i dati su un singolo "Manager", potrebbe essere utile cambiarne il nome nel singolare Manager.

+0

Grazie! questo è quello che stavo cercando. Solo una nota: le parentesi non vengono utilizzate nei tag del modello, quindi nel modello dovrebbe essere: manager.hostdata_set.all –

+0

Grazie, quello era un errore di copia e incolla credo. – Seth

+0

Divertente .. Ho finito per aver bisogno della * esatta * stessa cosa solo ora. Grazie Seth. –

0

Credo che (forse ??) siete alla ricerca di qualcosa di simile ...

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

Poi si può fare loop all'interno della vista?

Non sono esattamente sicuro che funzioni, ma fammi sapere se è utile.

0

Basta aggiungere i dati host imposta dinamicamente al contesto modello:

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

Poi, nel tuo modello è possibile scorrere i set di dati:

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

Sembra che si vuole chiedere il HostData per restituire tutti gli oggetti correlati a un determinato Manager. Se è così, allora dovresti sapere un'informazione unica sul Manager che stai cercando.

Per amor di discussione, supponiamo che il Gestore "id" è utilizzato come chiave primaria e quindi unico e sono alla ricerca di un id = 5.

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