簡體   English   中英

一個QuerySet用於兩個表(一對多相關)

[英]One QuerySet for two tables (one to many related)

我創建了一對多關系(兩個表),以便每個用戶都有自己的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)

我試圖在一個QuerySet獲取所有具有其連接( Conn )的User ,然后在模板中顯示所有內容。 到目前為止,我可以顯示每個用戶而不會出現任何問題

q=Users.objects.all()

並將QuerySet傳遞給模板。

這個問題可能有點不聰明,但是我如何才能將所有包含相關連接( Conn )的User查詢為一個QuerySet ,然后以一種形式枚舉此連接?

使用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 ,效率更高。

請注意,您還可以通過選擇更合適的字段類型來清理某些字段 例如,對於src_ipdst_ip考慮GenericIPAddressField

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM