[230208 - TIL] Python에서 Dictionary 비교를 이용한 리소스 업데이트 확인

Dongwoo Kim·2023년 2월 8일
0

TIL / WIL

목록 보기
78/113

1. 개요

외부 API를 이용하여 특정 리소스 목록을 받아와 DB저장하고 관리하고 싶은데 updated_at과 같은 업데이트 여부를 알 수 있는 정보가 없었다. 따라서 지금 가지고있는 리소스와 새롭게 받아온 리소스의 목록을 비교해서 업데이트되었는지 확인하고자 했는데, python에서 dictionaries compare를 이용하여 아주 간단하게 확인할 수 있는 방법이 있었다.


2. 예상 시나리오

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는 아래 포스팅에서 알 수 있다.

profile
kimphysicsman

0개의 댓글