2017-11-07 4 views
0

모든 사용자가 고유 한 IP 연결 목록을 갖도록 일대 다 관계 (두 테이블)를 만들었습니다. 모든 사용자는 많은 연결을 가지고 있습니다.두 테이블에 대한 하나의 QuerySet (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) 

나는 하나 QuerySet 자신의 연결 (Conn) 모든 User의를 가져온 다음 템플릿에 모든 것을 표시하기 위해 노력하고있어. 지금까지 나는

q=Users.objects.all() 

으로 아무 문제없이 모든 사용자를 표시하고 템플릿에 QuerySet를 통과 할 수 있습니다.

문제는 조금 똑똑하지가 있습니다 만, 어떻게 형태로이 연결을 열거 한 후 하나 QuerySet과 같은 관련 연결 (Conn)을 포함한 모든 User들 조회 할 수 있습니다?

답변

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를 돌려, 지정된 조회의 각 관련 개체. 당신이 관련 User과 함께 모든 Conn 객체를 찾는 다른 방향으로 물건을 찾기 위해 노력하려는 경우이 일대일 관계를되었거나했다면

, 당신은 select_related 사용했을 수있는 더 효율적입니다.

field types을 적절하게 선택하여 일부 필드를 정리할 수도 있습니다. 예를 들어, src_ipdst_ip의 경우 GenericIPAddressField을 고려하십시오.