2017-11-07 15 views
0

すべてのユーザーが独自のIP接続リストを持つように1対多の関係(2つのテーブル)を作成しました。すべてのユーザーには多くの接続があります。2つのテーブル用の1つのクエリセット(1対多関連)

私のモデルは以下の通りである:

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) 

は、私は1つQuerySetにその接続(Conn)ですべてUser Sを取得し、テンプレート内のすべてのものを表示しようとしています。これまでのところ私は

q=Users.objects.all() 

とテンプレートにQuerySetを渡すと何の問題もなく、すべてのユーザーを表示することができます。

質問は少しスマートではないかもしれないが、どのように私は1つQuerySetと関連接続(Conn)を含むすべてのUser Sを照会し、フォームでこの接続を列挙することができますか?

答えて

1

使用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を返しドキュメントから

、。

これは1対1の関係であったか、関連Userとともに、すべてのConnオブジェクトを見つけ、他の方向で物事を検索しようとしてきたいならば、あなたはselect_relatedを使用している可能性が、その場合はさらに効率的です。

さらに、適切なfield typesを選択してフィールドの一部をクリーンアップすることもできます。たとえば、src_ipdst_ipの場合、GenericIPAddressFieldとします。

関連する問題