一个QuerySet用于两个表(一对多相关) [英] One QuerySet for two tables (one to many related)
问题描述
我创建了一对多关系(两个表),以便每个用户都有自己的IP连接列表.每个用户都有很多连接.
I have created one to many relationship (two tables) such that every user has its own IP connections list. Every user has many connections.
我的模型如下所示:
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)
我试图在一个 QuerySet
中获取所有 User
及其连接( Conn
),然后在模板中显示所有内容.到目前为止,我可以毫无问题地显示每个用户
I'm trying to get all User
s with their connections (Conn
) in one QuerySet
and then display everything in template. So far I can display every User without any problems with
q=Users.objects.all()
并将 QuerySet
传递给模板.
这个问题可能有点不聪明,但是我怎样才能将所有的 User
包括相关的连接( Conn
)作为一个 QuerySet
进行查询,并且然后以一种形式枚举此连接?
The question may be a bit not smart but how can I query all User
s including related connections (Conn
) as one QuerySet
and then enumerate this connections in a form?
推荐答案
使用 与预取相关
:
users = User.objects.all().prefetch_related('conn_set')
现在,对于每个用户,您可以查看其 conn_set
并查看与其链接的 Conn
对象.假设您将 users
作为上下文变量 users
传递到模板,则应如下所示:
Now for each user you can look at its conn_set
and see the Conn
objects linked to it. Assuming you pass users
to your template as a context variable users
, something like this should work:
{% for user in users %}
{{ user.e_user }}
{% for connection in user.conn_set.all }}
{{ connection.src_ip }}
{% endfor %}
{% endfor %}
调整字段并添加其他标记以适合您的需求.
Adjust fields and add other markup to suit your needs.
从文档中, prefetch_related
返回一个
QuerySet
,该查询集将自动为每个指定的查询分批检索相关对象.
Returns a
QuerySet
that will automatically retrieve, in a single batch, related objects for each of the specified lookups.
如果这是一对一的关系,或者您正试图朝另一个方向查找,请查找所有 Conn
对象以及相关的 User
,您可能已经使用 select_related
,效率更高.
If this had been a one-to-one relationship or if you'd been trying to look things up in the other direction, finding all Conn
objects along with the related User
, you could have used select_related
, which is even more efficient.
请注意,您还可以通过选择更合适的字段类型.例如,考虑 GenericIPAddressField
用于 src_ip
和 dst_ip
.
Note that you can also clean up some of your fields by choosing more appropriate field types. For example, consider GenericIPAddressField
for src_ip
and dst_ip
.
这篇关于一个QuerySet用于两个表(一对多相关)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!