2009-04-20 3 views
1

내가 왼쪽의 약간 문제에 가입이 가입 왼쪽 .. 나는 다음과 같은 모델장고가

class CommandInfo(models.Model): 
    server = models.ForeignKey(Server) 
    count = models.IntegerField(default=1) 
    ts = models.DateTimeField(auto_now=True) 

class Server(models.Model): 
    name = models.CharField(max_length=100) 
    group = models.ForeignKey(ApplicationGroup, blank=True, default=0) 
    host = models.CharField(max_length=100) 
    ip = models.IPAddressField(db_index=True) 
    about = models.TextField() 
    firstTS = models.DateTimeField(auto_now_add=True) 
    lastTS = models.DateTimeField(auto_now=True) 
    processed = models.SmallIntegerField(max_length=1, default=0) 

    def __unicode__(self): 
     return self.host 

나는 모든 서버 인스턴스를 잡기 위해 필요 하나이 경우에하는 CommandInfo 가입 남아 있습니다.

는 지금은 원시 SQL에서 그것을하고 있어요

from django.db import connection 
cursor = connection.cursor() 
cursor.execute("SELECT host,ts,count as host FROM servers_server LEFT JOIN cmds_commandinfo ON server_id=servers_server.id") 
servers = cursor.fetchall() 

답변

2
당신은 같은 코드를 사용할 수 있습니다

다음

s 세트 등을 모두하는 CommandInfo 객체의 목록을 반환
s = Server.objects.get(id=1) 
cmdinfo = s.commandinfo_set.all() 

외래 키.

Django 문서 "Following Relationships Backward"에서 자세한 정보를 얻을 수 있습니다.

0

가끔 Django ORM에 select_related()를 사용하여 명시 적으로 이름을 지정하려면 왼쪽 결합 필드 이름이 필요합니다.

당신은 아마 그것을 조정할 수 있지만, 같은 것을 시도해야합니다, 그래서 이건 그냥 내 머리 위로 떨어져 있습니다 :

s = Server.objects.select_related('commandinfo_set') 
+1

'.select_related'는 이전 관계에서 작동하지 않으므로 작동하지 않습니다. 메소드가 호출 된 모델의'ForeignKey'와'OneToOneField' 필드에서만 작동합니다. –

0
commands_by_server_id = defaultdict(list) 
for c in CommandInfo.objects.select_related('server'): 
    commands_by_server_id[c.server.id].append(c) 

servers = Server.objects.all() 
for s in servers: 
    s.commands = commands_by_server_id.get(s.id, []) 

당신으로 인해 서버 목록을 얻을 필요가 있습니다를 CommandInfo가없는 서버

관련 문제