저장 취소
guest search tags write
가죽 django 상암동 면식 후기 식사
의식
18/05/18 16:34

출근길에 경의선 수색역에 내릴 때 높은 확률로 한 여성분과 마주치곤 한다. 수색역에서 서울역 쪽으로 전철을 타고 가는 분인데, 약간 덩치가 있어서 쉽게 눈에 띄는 외모이기도 하지만, 기억에 남는 것은 항상 수색역 자판기에서 커피 한잔을 뽑아서 마시는 모습을 보게 되기 때문이다.

reply delete edit
상암동 만복국수
17/04/20 17:17

오늘부터 그냥 기록 차원에서 점심 후기를 쓰기로 함.





상암동 월드컵파크 4단지 상가 만복국수.
밖에서는 잘 안 보임. 베스킨라빈스 옆에 있는 계단으로 올라가면 고만고만한 크기의 식당들 끝에 있음.
테이블은 10개 정도? 
오늘 시킨 메뉴는 1번세트(파전 + 멸치국수 2) + 2번세트(보쌈 1/2 + 멸치국수 2)





메인인 4500원짜리 멸치국수는 삶아서 사려놓은 국수에 뜨거운 육수 부어주는 스타일인데, 면발은 불거나 하지는 않고 괜찮았음.
남해산 멸치로 우려냈으니 꼭 다 마시라고 써붙여놓은 육수는 처음에는 약간 비린향이 올라오지만 거슬리지는 않고 적당히 맛있게 먹을 수 있는 정도. 좀 덜 짰으면 더 좋았을텐데 나에게는 약간 간이 셌다. 하지만 국물까지 싹싹 다 마셨음.
양은 약간 부족해서 사리 추가.





보쌈은 그냥 아무데서나 먹을 수 있는 보쌈과 비슷함.
파전은 바삭하니 맛있었음. 지난번에 저녁에 가서 안주로 먹은 모듬전은 별로였는데 ㅎㅎ




또 간다면 그냥 멸치국수에 먹어보진 않았지만 주먹밥 정도 추가해서 먹을 듯.

reply delete edit
relation in django
17/04/20 17:13

framework에서 뭔가 복잡한 DB 쿼리를 해야할 일이 생기면 항상 고민스럽다.
그냥 속 편하게 raw query를 써버릴까 아니면 어떻게든 얘들이 원하는 대로 해볼까.



사실 그냥 raw query를 써버리는게 속 편하긴 하다. 자세히 안 보고 framework이 제공하는 query builder를 사용하다 보면 전혀 생각하지 못한 쿼리가 실행되어 버리는 수가 많아서 꼭 실제로 실행되는 쿼리를 확인하는 작업이 필요하다.



글과 댓글이 하나의 테이블에 들어가고 parent, depth로 관계를 표현하는 시나리오를 생각해보자.



model은 대략 이렇게 만들어볼 수 있겠다.




class Post( models.Model ):
id = models.AutoField( primary_key=True, db_column='id' )
depth = models.IntegerField()
parent = models.ForeignKey( 'self', db_column='parent', limit_choices_to=Q( depth__gt=0 ), related_name='+' )
text = models.TextField()


코드로 처리하는 방식은 view 를 이렇게.






class MainView( TemplateView ):
model = Post
template_name = 'post.html'
def get_context_data( self, **kwargs ):
context = super( MainView, self ).get_context_data( **kwargs )
# 본문 글 10개 query
posts = list( Post.objects.filter( depth=0 ).order_by( '-id' )[:10] )
# 본문 글의 id 를 뽑아서 리스트로 만든다.
id_list = list( [ p.id for p in posts ] )
# 본문 글의 id 를 parent 로 가지는 글들을 뽑아서 replies 리스트를 만든다.
replies = list( Post.objects.filter( depth__gt=0 ).filter( parent__in=id_list ).order_by( 'id' )
# { PARENT_ID : POST } 형태의 dictionary 로 재구성하여
replies_dict = {}
for reply in replies:
replies_dict.setdefault( reply.parent_id, [] ).append( reply )
# posts list 의 각 Post 객체에 replies 속성을 추가한다.
for idx, post in enumerate( posts ):
setattr( posts[idx], 'replies', replies_dict.get( post.id, [] ) )
context['posts_list'] = posts


이렇게 하면 2개의 쿼리로 마무리된다.



SELECT * FROM post WHERE depth = 0 ORDER BY id DESC LIMIT 10
SELECT * FROM post WHERE depth > 0 AND post.parent IN (............) ORDER BY id ASC



이렇게 해도 되지만, 코드가 좀 보기 안 좋으니 django에서 지원하는 방식으로 처리하는 방법은 다음에... :)

reply delete edit
1 2 3 4 5 6 7 8 9 10 ... 124