시간에 따라 바뀌는 데이터

“오늘의집”에서는 오늘의 딜이라는 정해진 시간마다 데이터가 바뀌는 상품들이 있다.

직접 상품을 파는 것은 아니었기 때문에 팀 회의에서 하루를 기준으로 변경하자고 의견을 모았다.

처음 생각한 것은 crontab이었지만, 한번도 적용해보지 못해 시간이 얼마나 걸릴지 몰랐다.

그래서 일단은 Front분들이 API 요청을 통해 데이터를 받을 수 있도록 다른 방법을 생각했다.

일단 오늘의 딜의 상품을 4개로 잡고 상품 고유 id를 저장할 수 있도록 모델을 만들었다.

그리고 auto_now라는 옵션을 적용한 DateField를 만들어서 모델에 수정이 일어날 때마다

날짜가 업데이트되도록 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
class HotDealNumber(models.Model):
# 랜덤 숫자를 위한 필드
product_rnd_number = models.PositiveIntegerField(default=0)
# 날짜 비교를 위한 필드
updated = models.DateField(auto_now=True)

def __str__(self):
# 객체의 이름 - 랜덤 숫자
return str(self.product_rnd_number)

class Meta:
ordering = ['id']

그리고 view에서 쿼리를 반환할 때 오늘 날짜와 DB에 저장된 날짜를 비교해서

랜덤 숫자를 다시 뽑을 수 있도록 구현하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from django.db.models import Q
from datetime import date

import random

# 상품 180개 중에 랜덤 숫자를 뽑아서 DB에 저장
def updated_hot_deal_num(self):
for i in range(1, 5):
num = random.randrange(0, 181)
print(num)
HotDealNumber(id=i, product_rnd_number=num).save()

def get_queryset_product(self):
result = Product.objects.all()
# 오늘 날짜를 받아옴
today = date.today()
hot_deal_num = HotDealNumber.objects.all()

# 오늘 날짜와 DB에 저장된 날짜를 비교해서 같지 않으면
# 랜덤 숫자를 뽑는 함수 실행
if not today == hot_deal_num[0].updated:
self.updated_hot_deal_num()

result = Product.objects.all().filter(Q(id=hot_deal_num[0].product_rnd_number)
| Q(id=hot_deal_num[1].product_rnd_number)
| Q(id=hot_deal_num[2].product_rnd_number)
| Q(id=hot_deal_num[3].product_rnd_number))
return result

구현하고 나서 느꼈던 문제는 API를 요청할 때마다 해당 로직이 수행된다는 점이다.

crontab을 적용해서 변경시켜야 겠다.

Share