一个QuerySet用于两个表(一对多相关) [英] One QuerySet for two tables (one to many related)

查看:58
本文介绍了一个QuerySet用于两个表(一对多相关)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一对多关系(两个表),以便每个用户都有自己的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 Users 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 Users 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆