[django] model.objects.filter를 이용한 검색기능 추가

django에서 model.objects.filter를 이용해 제목, 본문을 검색할 수 있는 기능을 추가하려고 한다.

#index.html

<form class="form-inline" action="{% url 'blog:index' %}" method="get">
    <div class="input-group">
        <select name="fd_name" id="" class="form-control">
            <option value="title">title</option>
            <option value="content">content</option>
        </select>
        <input type="text" class="form-control" name='q'>
        <button class="btn btn-secondary" type="submit">Search</button>
    </div>
</form>
#vew.py

def index(request):
    if request.GET.get('q'):
            variable_column = request.GET.get('fd_name')
            search_type = 'contains'
            filter = variable_column + '__' + search_type
            posts = Post.objects.filter(**{ filter: request.GET.get('q') }).order_by('-published_date')
    return render(request, 'blog/index.html', {
        'posts': posts,
    })

맨처음에는 Post.objdects.filter(requests.GET.get(‘q’)+’__contains’ = requests.GET.get(‘q’))으로 시도를 했지만 에러를 냈다. 문자열로 받아드리기 때문에 장고에서 필드명을 찾지 못하는것 같았다.

modesl.objects.fillter(**kwargs)로 인자를 받기때문에 문자열이 아닌 딕셔너리 **{key:value}로 인자를 전달해서 문제를 해결했다.

참고 사이트
https://docs.djangoproject.com/en/2.1/topics/db/queries/
https://stackoverflow.com/questions/4720079/django-query-filter-with-variable-column
https://wayhome25.github.io/django/2017/05/04/django-queryset-search/

[heroku]로컬db 헤로쿠로db에 덮어쓰기

이전 포스팅에서 헤로쿠 디비를 로컬로 복원하는 방법을 기록했다. 이번에는 반대의 경우를 포스팅 하고자 한다.

환경
1. django, postgreSQL 사용
2 .우분투

로컬에서 dump 파일 생성

PGPASSWORD=mypassword pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb > mydb.dump

헤로쿠에 업데이트하기

heroku pg:backups:restore '<SIGNED URL>' DATABASE_URL

‘<SIGNED URL>’ 을 통해서 헤로쿠에 파일을 전달해야 하므로 파일을 웹(깃, 기타 호스팅) 어디가에 저장해놓아야 한다.

참고사이트 : https://devcenter.heroku.com/articles/heroku-postgres-import-export
이전포스팅: 헤로쿠 DB백업 후 로컬로 복원

[heroku] 헤로쿠 DB백업 후 로컬로 복원

헤로쿠 메인페이지
헤로쿠 메인페이지

헤로쿠앱에서 원격으로 작업하지 않고 로컬에서 작업후 업데이트하고자 했음.
로컬에은 sqlite3을 사용하였고 헤로쿠앱은 postgresSQL을 사용하고 있었기 때문에 로컬의 데이터베이스시스템을 변경할 필요가 있었다.

1. 헤로쿠에서 디비파일을 덤프뜨고 로컬로 내려받는다.

heroku pg:backups:capture
heroku pg:backups:download

2. 윈도우용 postgresSQL 설치 후 환경변수 등록
postgresSQl 다운로드
내pc>속성>고급시스템설정>고급>환경변수>시스템변수에서 path 편집>C:\Program Files\PostgreSQL\11\bin경로 추가

3. pgAdmin4에서 사용자 및 디비를 생성한다.
참고주소 : https://www.pgadmin.org/docs/pgadmin4/dev/pgadmin_user.html

4. 디비를 복원한다

pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump

5. 헤로쿠 깃에서 앱 다운로드

heroku git:clone -a myapp

6. setting.py 파일 수정

django와 postgreSQL을 연결하기 위해서  psycopg2 라는 모듈이 필요함 pip list 명령어를 통해서 패키지 확인후 없으면 pip install  psycopg2
설치를 마치면 setting.py 파일의 데이터베이스부분을 수정

setting.py

DATABASES = {
    "default": {
	'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'databsename',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

7. django 실행

# 정적파일들을 해당앱으로 불러온다
python manage.py collectstatic 

# 로컬서버실행
heroku local web -f Procfile.windows

# 리눅스일경우
heroku local web

# 데이터베이스 마이그레이션
python .managr.py makemigrations
python .managr.py migrate

localhost:5000/admin으로 접속해 데이터 복원을 확인