[백엔드] django serializer 관련 여러가지 요청사항
지금까지 보내왔던 리퀘스트 방식
이 방식을 보고 프론트에서 요청이 들어왔다. subtodos나 todos가 아닌 children으로 보내달라는 요청이였다.
그래서 아래의 2가지 방식으로 일단 적용해봤다.
https://gaussian37.github.io/python-rest-nested-serializer/
DRF에서 Nested Serializer 사용법
gaussian37's blog
gaussian37.github.io
일단 아래의 블로그를 참고해서 위의 subtodos 를 작성했는데.. 모델을 바꾸지 않는 선에서 serailizer 의 subtodos 를 모두 children으로 바꿔본다. -> 실패, 아예 children 이 없는 형태로 보임
model에 있는 Related_name을 바꾸고 한번 도전해본다. 일단 예상대로 성공했다. 일단 이 방식으로 진행하는 편이 나을 것 같다.
할일 2. inbox 뷰와 데일리 투두 뷰 만들기
일단 조건사항은 아래와 같다.
인박스 조건
Todo : start_date 와 end_date가 모두 없으면 인박스
SubTodo : Todo가 데일리라면 date의 값이 없어야 함, Todo가 인박스라면 subTodo 는 무조건 인박스
데일리 투두의 조건
[v] 둘 중 하나라도 있으면 데일리에 보여야 함
[v] SubTodo : Todo가 일단 데일리여야 함 + date 가 설정된 경우
데일리 투두는 Prefetch 와 Q 를 통해 쉽게 해결할 수 있었다
이런식으로 작성해서 투두의 경우 날짜에 대한 값이 하나라도 있다면 뜨도록 작성했다.https://axce.tistory.com/10
Django 장고 ORM으로 OR/AND 사용하기(Q 사용)
# Django Queryset(ORM)으로 OR/AND 사용 방법 (WHERE절) # Q 활용방법 # SQL의 OR/AND 사용하는 방법 # 비전공자가 이해한 Django 1. AND AND 사용 방법은 간단합니다. filter 함수 안에 "Field명=값" 으로 표현하면 됩니
axce.tistory.com
문제는 인박스였다...
이런식으로 했을 때의 문제는 date_is_not_null_todos 에서 나타나는데..
일단 저 조건은 데일리 투두에 더 적합하다. 근데 생각을 해보니 인박스에 있는 서브투두를 보여주기 위해서는 투두가 데일리 투두여도 보여줘야한다는 점이 있다. 그래서 저런 코드를 작성했다.
문제는 만약 해당 투두의 서브투두에 속한 어떠한 코드도 없다면 저 투두는 보여서는 안된다는 점이다!
그래서 이것저것 찾아봤다.
일단 예상하는 바로는 children 을 열심히 카운트해주고 카운트 한 값이 0이상인 친구들만 모아서 만드는 수 밖에 없을 것 같다.
⭐️원하는 조건 -> model은 따로 만지고 싶지 않다.
DjangoREST annotate count of related entries with filtering
So I'm doing a little project in Django REST, and I'm still getting used to the ORM. I'm dealing with the following Django model: class Session(models.Model): date = models.DateTimeField(defau...
stackoverflow.com
일단 여기서 annotation 방식을 사용해봤는데 union 에서 필드 수가 같지 않다고 오류가 떴다.
그래서 그냥 카운트해줄 수 있는 걸 찾아본다..
다시 annotation을 써봤는데, 이번엔 children 부분에 해봤다. 완벽히 잘못 썼다. 안나온다.
처음에 썼던 방식인 annotate 쓰다가 계속 콜롬 안 맞는 에러뜨길래 좀 슬퍼하다가 갑자기 불현듯 떠올렸다
해결 완료했다...
약간의 생각을 돌려봤는데.. 일단 sub 중에 null 이 있는 애들을 전부 출력한 후에, sub가 없는데 나와야하는 애들을 or처리로 했다.
깔끔해져서 행복하다 :]