Как вернуть несколько объектов, связанных с ForeignKey в Django

у меня есть следующее В моем models.py:

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)

Я хотел бы вернуть запрос для объектов, связанных с неким "менеджером". Проблема в том, что пользователь может добавлять / удалять столько менеджеров, сколько он хочет. Так что моей первой мыслью было views.py что-то вроде этого:--3-->

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

Итак, как я могу вернуть несколько объектов? Например, если пользователь добавит еще один "менеджер", я получу третий набор в своем views.py.

4 ответов


вы можете запросить на связанные объекты вот так:

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

в вашем шаблоне вы также можете просто получить доступ к hostdata_set напрямую:

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

Я считаю, что это то, что вы просите.

кстати, если ваш Managers модель хранит данные об одном "менеджере", вам может быть полезно изменить его имя на единственное Manager.


Кажется, что вы хотите попросить HostData вернуть все объекты, связанные с определенным менеджером. Если это так, то вы должны знать одну уникальную информацию о конкретном менеджере, которого вы ищете.

для аргумента предположим, что менеджер " id " используется в качестве первичного ключа и, следовательно, уникален, и мы ищем id = 5.

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

Я думаю (может быть??) вы ищете что-то подобное...

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

тогда вы можете сделать цикл внутри представления?

Я не совсем уверен, что это сработает, но дайте мне знать, если это поможет.


просто добавьте наборы данных хоста динамически в контекст шаблона:

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

затем в вашем шаблоне вы можете перебирать наборы данных:

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