一个QuerySet用于两个表(一对多相关)

时间:2017-11-07 13:16:09

标签: django django-templates

我创建了一对多关系(两个表),这样每个用户都有自己的IP连接列表。每个用户都有很多联系。

我的模型如下所示:

class Conn(models.Model):
        src_ip = models.CharField(max_length=18, unique=False,default=None,blank=True,null=True)
        src_port = models.CharField(max_length=6, unique=False,default=None,blank=True,null=True)
        dst_ip = models.CharField(max_length=18, unique=False,default=None,blank=True,null=True)
        dst_port = models.CharField(max_length=6, unique=False,default=None,blank=True,null=True)
        proto = models.CharField(max_length=6, unique=False,default=None,blank=True,null=True)
        start_data = models.CharField(max_length=18, unique=False,default=None,blank=True,null=True)
        r_user = models.ForeignKey(User, on_delete=models.CASCADE)

class User(models.Model):
        e_user = models.CharField(max_length=15, unique=False,default=None,blank=True,null=True)
        e_dev = models.CharField(max_length=15, unique=False,default=None,blank=True,null=True)
        e_session = models.CharField(max_length=9, unique=False,default=None,blank=True,null=True)
        e_start = models.CharField(max_length=20, unique=False,default=None,blank=True,null=True)
        e_stop = models.CharField(max_length=20, unique=False,default=None,blank=True,null=True)
        e_summary = models.CharField(max_length=20, unique=False,default=None,blank=True,null=True)
        e_ip = models.CharField(max_length=20, unique=False,default=None,blank=True,null=True)

我正在尝试将所有User个连接(Conn)放在一个QuerySet中,然后在模板中显示所有内容。到目前为止,我可以毫无问题地显示每个用户

q=Users.objects.all()

并将QuerySet传递给模板。

问题可能有点不聪明但我如何查询所有User包括相关连接(Conn)为QuerySet,然后在表单中枚举此连接?< / p>

1 个答案:

答案 0 :(得分:1)

使用prefetch_related

users = User.objects.all().prefetch_related('conn_set')

现在,对于每个用户,您可以查看其conn_set并查看与其关联的Conn个对象。假设您将users作为上下文变量users传递给模板,这样的事情应该有效:

{% for user in users %}
    {{ user.e_user }}

    {% for connection in user.conn_set.all }}
        {{ connection.src_ip }}
    {% endfor %}
{% endfor %}

调整字段并添加其他标记以满足您的需求。

从文档中prefetch_related

  

返回QuerySet,它将在一个批处理中自动检索每个指定查找的相关对象。

如果这是一对一的关系,或者您一直试图向另一个方向查找内容,找到所有Conn个对象以及相关的User,您可以使用了select_related,效率更高。

请注意,您还可以选择更合适的field types来清理部分字段。例如,考虑src_ipdst_ip的{​​{3}}。