aytekin의 노트 131

[django] Related Field got invalid lookup: icontains 오류

search_fields 옵션에 원하는 필드들을 넣어서 admin페이지에서 검색 가능하도록 만들려고 하는 중에 "Related Field got invalid lookup: icontains" 이런 오류에 맞딱뜨렸다. 아래 코드가 admin.py에서 오류가 났었던 코드이다. models.py를 보면 title, content 필드는 Post테이블 자체필드이지만 username 은 User라는 테이블에서 외래키로 연결시켜놓은 상태이다. 즉 username필드는 User테이블과 연결시켜주는 고유값일 뿐이다. 따라서 django는 User테이블에서 어떤 필드를 가지고 검색해야 하는지 모르는 것이다. 그래서 에러가 났을 뿐... # models.py class Post(BaseModel): username = ..

[django] User모델 커스터마이징 할 때 오류

AbstractUser를 사용해서 User모델을 커스터마이징 하고 나서 마이그레이션 할 때 아래와 같은 오류가 났을 때 해결방법 장고에서 만들어 둔 User 모델이 아니라 내가 커스텀해서 만든 User모델을 사용하고자 하는 것이므로 장고한테도 이 사실을 알려줘야 한다. 프로젝트 디렉토리의 settings.py에 AUTH_USER_MODEL 환경 변수를 '[앱이름].[모델이름]'이런식으로 지정해주면 된다. 예시) AUTH_USER_MODEL = 'users.User'

[django] ImageField Form 이미지 업로드하기.

django Form에서 이미지를 업로드해서 DB에 저장하는 기능을 구현하는 방법이다. 이미지 파일이 form에서 view로 넘어가지도 않는 문제, view에서 조회하는 문제들을 해결하였다. 1. media폴더 경로 설정 프로젝트 폴더 settings.py 마지막줄에 MEDIA_URL, MEDIA_ROOT 추가 # setting.py # ... 이외의 기본 세팅들 MEDIA_ROOT = BASE_DIR/'media' MEDIA_URL = '/media/' 프로젝트 폴더 urls.py에 urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 추가 # urls.py from django.contrib import admin f..

(파이썬 python) 백준 13904번 : 과제(greedy)

점수가 큰 과제를 뒤에서부터 채워나가는 방법으로 과제를 해결하도록 계획을 세워야 한다. (처음엔 점수가 큰 과제부터 한다거나 마감일이 빠른 과제부터 끝내는 방법을 생각해보았지만 답은 아니었다.) 마감일 | 점수 4 | 60 4 | 40 1 | 20 2 | 50 3 | 30 4 | 10 6 | 5 이렇게 과제와 마감일이 주어져있을 때 가장 점수가 높은 과제부터 마감일부터 뒤로 계획을 세워준다. 60점 과제는 4일째 50점 과제는 2일째 40점 과제는 4일째에 이미 60점짜리를 해야하므로 3일째 30점 과제는 3일째, 2일째 이미 다른 과제가 있으므로 1일째 20점,10점 과제는 남은 기간이 없으므로 패스 5점 과제는 6일째 이런 식으로 이런 알고리즘을 구현하는 데엔 heap 자료구조를 사용하는 것이 유용하..

(파이썬 python) 백준 1213번 : 팰린드롬 만들기(greedy)

구글링에서 본 것중 가장 직관적이고 쉬운 풀이를 가져왔다. names = input() name_cnt = [0 for _ in range(26)] for name in names: name_cnt[ord(name)-65] += 1 odd = 0 odd_alpha = '' alpha = '' for i in range(26): if name_cnt[i] % 2 == 1: odd += 1 odd_alpha += chr(i+65) alpha += chr(i+65) * (name_cnt[i] // 2) if odd > 1: print("I'm Sorry Hansoo") else: print(alpha+odd_alpha+alpha[::-1]) # 참고 : https://alpyrithm.tistory.com/1..

(파이썬 python) 백준 11000번 : 강의실 배정(greedy)

우선 입력할 때 input으로 하니 시간초과가 떳다. -> sys라이브러리의 stdin.readline사용. 로직 1. 강의시간을 시작시간으로 정렬. 2. 맨 처음 강의시간의 종료시간과 두번째 강의의 시작시간을 비교 - 시작시간보다 종료시간이 느리면 새로운 강의실 배정 -> room에 heapq.heappush로 추가. - 시작시간보다 종료시간이 빠르면 기존 강의실의 종료시간 수정 -> room에 heapq.heappop 으로 기존 강의실 종료시 간을 제거하고 heapq.heappush로 새로운 종료시간 추가 굳이 heap자료구조를 사용해야 하나 생각을 해보았다. 우선 heap 자료구조가 시간복잡도 측면에서 list보다 효율적이고 heap을 사용하면 최소힙을 계속 유지해주기도 한다. # 11000번: 강..

(파이썬 python) 백준 9237번 : 이장님 초대(greedy)

1. 다 자라는데 가장 오랜 기간이 걸리는 나무를 첫 날 심어줘야 하기 때문에 나무를 내림차순 정렬 2. 심는데 1일, 다 자라고 나서 1일 총 2일 필요 + 심는 날짜 별로 일수 추가 3. 제일 늦게 완성되는 날짜 일수 출력. 예 - [2,3,4,3]의 나무가 있는 경우 1. 나무 [4,3,3,2]로 정렬 2. 각 나무 완성에 필요한 일수 계산 -> [2,3,4,5]를 각각 자리별로 더해줌. 3. 더해진 리스트에서 최대값 출력 # 9237번 : 이장님 초대 n = int(input()) li = list(map(int,input().split())) li.sort(reverse=True) li2 = [i+2 for i in range(n)] ans = [x+y for x,y in zip(li,li2)]..

백준 1343번 : 폴리오미노 (greedy)

1. 먼저 '.' 을 기준으로 입력값을 구분할 수 있도록 split함수를 사용하였다. 2. 구분된 리스트의 각 값들의 길이가 홀수이면 -1을 출력할 수 있도록 해준다. 이 때, flag변수를 설정해서 구분하였다. 3. 먼저 'AAAA'를 4로 나눈 몫만큼 곱해주고 나머지에 2로 나눈 몫만큼 'BB'에 곱해준다. 사실 지금 생각해보니 2로 나눈 몫은 항상 1이 될 수 밖에 없다. (결과는 같다.) 참고 print함수를 사용해서 list를 차례대로 출력하려고 할 때 *를 리스트 앞에 붙여주면 띄어쓰지 않고 출력해준다. 이 때 sep, end같은 print내부 옵션도 당연히 사용 가능하다. # 1343번 : 폴리오미노 li = input().split('.') ans = [] flag = 0 for i in ..

백준 1138번: 한 줄로 서기(greedy)

입력값만큼 키가 큰 사람을 앞에 두고 줄을 세우는 문제이다. 왼쪽부터 숫자 0의 개수를 기준으로 위치를 찾아 줄을 세우면 된다. 예를 들어 2,1,1,0 이면 [0,0,1,0] -> 0을 2개 지나친 이후 1 위치 [0,2,1,0] -> 0을 1개 지나친 이후 2 위치 [0,2,1,3] -> 0을 1개 지나친 이후 3 위치 [4,2,1,3] -> 0을 0개 지나친 이후 4 위치 # 1138번 : 한 줄로 서기 n = int(input()) li = list(map(int,input().split())) ans = [ 0 for i in range(n)] for i in range(n): cnt = 0 for j in range(n): if cnt == li[i] and ans[j] == 0: ans[j]..

백준 3109번: 빵집 - 파이썬(greedy)

DFS알고리즘을 알고 있어야 풀 수 있는 문제다. R,C로 행과 열의 값 pipe에 파이프라인 visited에 파이프가 이미 설치되어 있는 곳인지 확인하기 위해 False로 초기화 리스트 이런 변수들을 입력 및 선언하고 왼쪽부터 시작해서 맨 오른쪽이 원웅이네 가게 파이프라인까지 최대한 많은 선을 연결해야 하므로 첫번째 열 에서 파이프라인이 있는 지점 pipe[i][0] == '.' 에서 부터 탐색을 시작한다. solve함수를 호출하여 건물이 있는 지점을 피하며 오른쪽으로 이동하고, 방문했던 지점은 True로 흔적을 남긴다. solve함수 종료조건인 j == C - 1 까지 도착하게 되면 True를 반환하여 cnt를 증가시킨다. # 3109번 : 빵집 def solve(i,j): # 원웅이네 파이프로 무사..