2011-10-26 4 views
8

ERR장고 ORM SELECT 장고에

모델을 결합하여 다음

NAME (from record) 
and fields related with this record 
[NAME (from key), VALUE (from value)] 
[NAME (from key), VALUE (from value)] 
[...] 

내가 장고 ORM이 선택을하는 데 사용할 수 있습니다 :

class Key(models.Model): 
    id  = models.AutoField(primary_key=True, blank=True) 
    name = models.CharField(max_length=50) 


class Record(models.Model): 
    id   = models.AutoField(primary_key=True, blank=True) 
    project_id = models.IntegerField() 
    name  = models.CharField(max_length=50) 


class Value(models.Model): 
    id  = models.AutoField(primary_key=True, blank=True) 
    record = models.ForeignKey(Record) 
    key  = models.ForeignKey(Key) 
    value  = models.CharField(max_length=255) 

나는 DB에서 데이터를 선택해야? (예를 들어, SQL select의 경우는 다음과 같습니다.)

답변

7

다음은 특정 레코드 ID와 관련된 값을 선택합니다. 그런 다음 외래 키를 따라 관련 레코드와 키를 얻을 수 있습니다. select_related을 사용하면 데이터베이스 조회가 최소화됩니다.

# Select all values related to a record in your view 
record = Record.objects.get(pk=record_id) 
values = Value.objects.filter(record=record).select_related() 

# In your template 
{% for value in values %} 
{{ value.record.name }} - {{ value.key.name }} - {{ value.value }} 
{% endfor %} 

은 SQL에서 둘 이상의 기록

를 선택, 당신은 WHERE record_id = 1 있었다, 그래서 나는 특정 레코드에 대한 모든 값을 가져 오는 방법을 보여 주었다. 하나의 쿼리에서 하나 이상의 레코드에 대한 값을 선택할 수도 있습니다.

# filter all records which belong to the project with `project_id=1` 
records = Record.objects.filter(project_id=1) 
# select all values that belong to these records 
values = Value.objects.filter(record__in=records).select_related().order_by('record') 
+0

각 레코드마다 값을 선택하는 추가 쿼리가 필요하다는 것을 알았습니다. 모든 레코드를 선택하려면 루프에서 값을 선택해야합니까? – Deadly

+2

하나 이상의 레코드 선택에 대한 답변을 업데이트했습니다. 희망이 도움이됩니다. – Alasdair

+0

그래, 정말 장고 ORM, 고마워 이해하는 데 도움이됩니다. – Deadly

2

외래 키가 이미 연결되어 있으므로 비교적 간단해야합니다.

Record.objects.select_related().filter(id = variable_that_stores_id) 

당신은 only로 다시 데려 할 필드를 제한하는 것을 결합 할 수 있습니다.

+0

'select_related'는 '뒤로'외래 키를 따르지 않으므로 여기서는 작동하지 않습니다. – Alasdair

+0

알겠습니다. 그것은 내 게시물 이후 질문이 조금 바뀌었지만, 그것이 잘못 되었든 불완전한 것인지에 관계없이 나타납니다. – Jordan