특정 테이블의 데이터가 생성될 시 자동으로 다른 테이블 데이터 생성

반응형

상황

  • 현재 데이터베이스 테이블에 로그, 로그 평균을 내야 하는 상황이다.

오른쪽과 같은 구조인데 원리는 이렇다.

특정 데이터 형식을 수신할때마다 로그에 남기고 해당 로그가 생성될때마다 시간대별 평균을 자동으로 생성해야 하는 상황이다.

Log에 아래와 같은 형식으로 데이터가 들어갈텐데,

id: 1
created_time: 20200202
masked: 10
unmasked: 20
sensor_id: 0000001234
time: 0900

Average_Log 테이블에는 여기서 sensor_id와 time을 기준으로 일 마다 시간대별 평균을 자동으로 만들어줘야 한다.

참고 자료

  • model의 save함수를 재정의하여 사용하면 해당 부분 해결이 가능

구현 코드

def save(self, force_insert=False, force_update=False, *args, **kwargs):
        super(Log, self).save(force_insert, force_update, *args, **kwargs)
        # you can add this for only existing model object
        if self.sensor_id:
            # You can check if only 'price' field changed
            masked_avg = Log.objects.filter(sensor_id=self.sensor_id, time=self.time).aggregate(Avg('masked'))['masked__avg']
            unmasked_avg = Log.objects.filter(sensor_id=self.sensor_id, time=self.time).aggregate(Avg('unmasked'))['unmasked__avg']
            masked_avg = round(masked_avg)
            unmasked_avg = round(unmasked_avg)
            
            exist = AverageLog.objects.filter(average_time=self.time, sensor_id=self.sensor_id)
            if exist:
                exist.update(average_masked=masked_avg, average_unmasked=unmasked_avg)
            else:
                AverageLog.objects.create(average_time=self.time, sensor_id=self.sensor_id, average_masked=masked_avg, average_unmasked=unmasked_avg)
반응형

'기술개발 > Django' 카테고리의 다른 글

objects.get 과 objects.filter 차이  (0) 2021.04.30
Django, git push 전 seceret_key 세팅  (2) 2021.04.27
6. Flutter와 API 연동  (1) 2021.01.07
5. Django 배포 with Heroku  (0) 2021.01.06
4. Django 백엔드 구축  (0) 2021.01.05