<오늘 한 일/>
- 알고리즘 문제 풀이
- 오랜만에 풀었다....ㅎ...
- https://guco.tistory.com/273
- 백엔드 코드 정리
accompanies/serializers.py 수정
- 기존 코드
class AccompanyCreateSerializer(serializers.ModelSerializer):
nickname = serializers.SerializerMethodField()
user = serializers.SerializerMethodField()
class Meta:
model = Accompany
fields = (
"id",
"user",
"nickname",
"content",
"personnel",
"start_time",
"end_time",
"updated_at",
)
read_only_fields = (
"nickname",
"updated_at",
)
def validate(self, data):
if data["start_time"] > data["end_time"]:
raise serializers.ValidationError("종료시간은 시작시간보다 빠를 수 없습니다.")
if data["personnel"] == 0:
raise serializers.ValidationError("목표인원을 1명 이상 선택하십시오.")
return data
def get_nickname(self, obj):
return obj.user.nickname
def get_user(self, obj):
return obj.user.id
class AccompanySerializer(serializers.ModelSerializer):
applies = ApplySerializer(many=True)
nickname = serializers.SerializerMethodField()
class Meta:
model = Accompany
fields = "__all__"
def get_nickname(self, obj):
return obj.user.nickname
- 원래는 이렇게 동행 구하기 시리얼라이저가 2개로 나눠져 있었다
- AccompanyCreateSerializer는 작성, 수정할 때 쓰이고, 그냥 AccompanySerializer는 조회할 때 쓰였다
- 근데 이 코드에서 문제가 read_only_fields가 fields와 같은 라인에 있어야 하는데 class Meta와 같은 라인에 있다 그래서 리드온리가 제대로 작동하지 않은 거였는데 그걸 모르고 시리얼라이저 통합이 안 되나보다...!! 라고 생각을 했었는데 다시 보니까 줄이 안 맞아서 그런 거였다...
- 그래서 코드를 수정해서 시리얼라이저를 통합했다
- 변경한 코드
class AccompanySerializer(serializers.ModelSerializer):
applies = serializers.SerializerMethodField()
nickname = serializers.SerializerMethodField()
picks_count = serializers.SerializerMethodField()
class Meta:
model = Accompany
fields = "__all__"
read_only_fields = (
"id",
"user",
"nickname",
"exhibition",
"applies",
"created_at",
"updated_at",
)
def validate(self, data):
start_time = data.get("start_time")
end_time = data.get("end_time")
personnel = data.get("personnel")
if start_time and end_time and start_time > end_time:
raise serializers.ValidationError("종료시간은 시작시간보다 빠를 수 없습니다.")
if personnel and personnel == 0:
raise serializers.ValidationError("목표인원을 1명 이상 선택하십시오.")
return data
def get_applies(self, obj):
applies = obj.applies.all().order_by("-updated_at")
return ApplySerializer(applies, many=True).data
def get_nickname(self, obj):
return obj.user.nickname
def get_picks_count(self, obj):
return obj.picks.count()
- 그리고 validate 함수에 해당 데이터가 있는지 확인하지 않고 바로 조건을 거니까 해당 데이터를 입력하지 않은 경우에 서버 에러가 뜨고 있었다
- 그래서 데이터를 가져와서 변수에 담고 "해당 변수에 데이터가 담겨 있으면" 이라는 조건을 추가해줬다
- 그리고 user 필드는 get_user에서 id값을 가져오지 않아도 이미 id가 담겨 있기 때문에 해당 부분을 삭제했다
그외
- 시리얼라이저 통폐합 한 거 말고는 자잘자잘하게 주석 수정, response 값 수정이어서 딱히 쓸 게 없다,,
- accompanies/reviews 앱 테스트코드 작성 및 수정
- 처음 함수를 작성했을 때는 테스트코드가 잘 동작했는데 어찌된 일인지 다시 테스트 하니까 fail 싸인이 떨어졌다
- 수정 테스트랑 삭제 테스트를 각각 돌리면 ok인데 한 번에 돌리면 수정 response에서 404 상태코드가 나왔다
- 각 테스트함수는 독립적으로 동작한다고 알고 있었는데 두 테스트 함수를 같이 돌리니까 에러가 나오는 걸로 봐서 서로 영향을 끼치고 있는 것 같았다
- 그래서 이것저것 검색하고 찾아본 결과 원래는 수정, 삭제 테스트에 각각 accompany 객체를 생성했었는데 객체 생성을 setUp함수에서 각 테스트 함수가 동작하기 전에 하는 걸로 수정했다
- 그리고 setUp()함수에 부모 setUp()함수를 실행함으로써 APITestCase에서 정의된 setUp() 함수가 실행되면서 기본 테스트 설정을 유지한 채로 테스트를 진행할 수 있도록 수정했다
- reviews 앱 테스트코드도 똑같이 수정하고, 삭제 테스트가 없길래 추가했다
- 그리고 views.py의 조회 함수가 사용되고 있지 않기 때문에 삭제하고, 테스트코드에서도 삭제했다
- 또, 수정, 삭제 테스트에서 path에 id값을 넣을 때 그냥 숫자 1을 썼었는데 setUp() 함수에서 생성한 객체의 id를 가져오는 걸로 수정했다
- 전에는 1로 써도 됐었는데..왜인지...이제 인식을 못 한다...
<느낀 점/>
- 코드 정리 생각보다 재밌다..!
<내일 목표/>
- 백엔드/프론트엔드 코드 정리 및 리드미 수정
- 알고리즘 문제 풀이