조인에있는 다른 관계 집계의 몇 가지 가능한 결과를 테스트하여 쿼리의 단일 값을 어떻게 나타낼 수 있습니까? 이것은 현재 장고 모델을 통해 액세스이 관계에 대한 CASE 절, 다른 관계에 대한 집계 함수 테스트
TABLE lorem (
id INTEGER
name VARCHAR
created TIME STAMP
PRIMARY KEY (id)
)
TABLE ipsum (
id INTEGER
lorem_id INTEGER
REFERENCES lorem(id)
state VARCHAR
PRIMARY KEY (id)
)
: 파이썬에서 제대로 작동
class Lorem(models.Model):
name = models.CharField()
created = models.DateTimeField()
def state(self):
ipsum_states = [ipsum.state for ipsum in self.ipsum_set]
if ipsum_states and all(
ipsum_state == 'complete' for ipsum_state in ipsum_states):
state = 'done'
elif any(
ipsum_state == 'error' for ipsum_state in ipsum_states):
state = 'failure'
elif any(
ipsum_state == 'begin' for ipsum_state in ipsum_states):
state = 'sending'
else:
state = 'not started'
return state
class Ipsum(models.Model):
lorem = models.ForeignKey(Lorem)
state = models.CharField()
나는이 스키마와 데이터베이스를 가지고있다. 그러나 모든 인스턴스에 대해 계산하는 것은 너무 느립니다.
이제 위의 Lorem 인스턴스 조건과 집계를 SELECT 문의 전체 집합 집계로 변환해야합니다. , 한Lorem
인스턴스에서 집계 함수는 파이썬 코드에서 사용할 수 있도록 내가 그 CASE 절을 만들 수있는 방법
SELECT
lorem.name AS name,
CASE
WHEN [… all the ipsum.state values,
for the set of ipsum referring to this lorem,
are 'complete' …] THEN 'done'
WHEN [… any ipsum.state value,
for the set of ipsum referring to this lorem,
is 'error' …] THEN 'failure'
WHEN [… any ipsum.state value,
for the set of ipsum referring to this lorem,
is 'begin' …] THEN 'sending'
ELSE 'not started'
END AS state
FROM
lorem
LEFT INNER JOIN ipsum
ON ipsum.lorem_id = lorem.id
;
:
그래서 나는 데이터베이스 뷰에서 결정된 state
값을 갖고 싶어 선택에 lorem
인스턴스 당 적절한 설정 작업 을 수행합니까?
표 lorem_name, lorem_id,
표 2 ipsum_state : 이
을 lorem_id 당신이 기본적으로 필요로하는 것은에서 작동하는 플래그입니다
은'ipsum' 관계는'states' 필드가없는 - 가 : 여기
내가이 개념에 대해 쓴 기사입니다. 요점은 관련된 모든'ipsum' 인스턴스에 대해'state' 필드의 여러 가지 * 집계를 수행하는 것입니다. – bignose