我创建了一对多关系(两个表),这样每个用户都有自己的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>
答案 0 :(得分:1)
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_ip
和dst_ip
的{{3}}。