如何在Django中返回与Foreign Key相关的多个对象

时间:2010-10-01 00:08:53

标签: django django-models django-views

我的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)

我想返回与某个“Manager”相关的对象的查询。问题是用户可以根据需要添加/删除尽可能多的管理员。所以我最初的想法是在我的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})

那么,我怎样才能返回多个对象?就像用户添加另一个“经理”一样,我将在我的views.py中获得第三组。

4 个答案:

答案 0 :(得分:12)

您可以像related objects一样查询:

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很有用。

答案 1 :(得分:2)

似乎您要求HostData返回与某个Manager相关的所有对象。如果是这样,那么您应该知道有关您正在寻找的特定经理的一条独特信息。

为了论证,让我们假设管理器“id”用作主键,因此是唯一的,我们正在寻找id = 5.

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

答案 2 :(得分:0)

我想(也许??)你正在寻找类似......

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

然后你可以在视图内循环吗?

我不太确定这会有效,但如果有帮助请告诉我。

答案 3 :(得分:0)

只需将主机数据集动态添加到模板上下文中:

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