외부 API를 이용하여 특정 리소스 목록을 받아와 DB저장하고 관리하고 싶은데
updated_at
과 같은 업데이트 여부를 알 수 있는 정보가 없었다. 따라서 지금 가지고있는 리소스와 새롭게 받아온 리소스의 목록을 비교해서 업데이트되었는지 확인하고자 했는데, python에서 dictionaries compare를 이용하여 아주 간단하게 확인할 수 있는 방법이 있었다.
RESPONSE_DATA
외부 API를 통해 할일 목록을 조회했다고 가정
RESPONSE_DATA = [ { "due_date": "2022-12-28 12:12:12", "title": "DictionartiesCompare", "content": "viewset TEST 1", "status": "DONE", "rating": 0, "user_id": 4, }, { "due_date": "2022-12-28 12:12:12", "title": "DictionartiesCompare", "content": "viewset TEST 2", "status": "DONE", "rating": 0, "user_id": 4, }, { "due_date": "2022-12-28 12:12:12", "title": "DictionartiesCompare", "content": "F TEST 3", "status": "DONE", "rating": 0, "user_id": 4, }, { "due_date": "2022-12-28 12:12:12", "title": "DictionartiesCompare", "content": "F TEST 4", "status": "DONE", "rating": 0, "user_id": 4, } ]
DB에 저장
def create(self, request): response_data = RESPONSE_DATA for data in response_data: Todo.objects.create(**data) return Response({"detail": "success"}, status=status.HTTP_201_CREATED)
새로운 RESPONSE_DATA
RESPONSE_DATA_2 = [ { "due_date": "2022-12-28 12:12:12", "title": "DictionartiesCompare", "content": "viewset TEST 1", "status": "DONE", "rating": 10, # changed "user_id": 4, }, { "due_date": "2022-12-28 12:12:12", "title": "DictionartiesCompare", "content": "viewset TEST 2", "status": "DONE", "rating": 0, "user_id": 4, }, { "due_date": "2022-12-28 12:12:12", "title": "DictionartiesCompare", "content": "F TEST 3", "status": "DONE", "rating": 10, # changed "user_id": 4, }, { "due_date": "2022-12-28 12:12:12", "title": "DictionartiesCompare", "content": "F TEST 4", "status": "DONE", "rating": 0, "user_id": 4, } ]
RESPONSE_DATA 같은 form을 가지는 serializer 작성
class TodoReadSerializer(serializers.ModelSerializer): due_date = serializers.SerializerMethodField() def transform_timezone(self, datetime): date = datetime.astimezone(timezone.get_current_timezone()) return date.strftime("%Y-%m-%d %H:%M:%S") def get_due_date(self, obj): return self.transform_timezone(obj.due_date) class Meta: model = TodoModel fields = [ "due_date", "title", "content", "status", "rating", "user_id" ]
비교 후 같은 결과만 반환
def put(self, request): response_data = RESPONSE_DATA_2 todo_list = Todo.objects.filter(title="DictionartiesCompare") todo_list = TodoReadSerializer(todo_list, many=True).data result = [] for todo in todo_list: for data in response_data: if todo == data: result.append(todo["content"]) break return Response(result, status=status.HTTP_200_OK)
결과
더 자세한 dictionaries compare는 아래 포스팅에서 알 수 있다.