[英]Getting related models from queryset of one-to-many relation with polymorphism
[英]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_ip
和dst_ip
考慮GenericIPAddressField
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.