django search

BackEnd_Ash.log·2020년 3월 1일
0

django 에서 2 세대와 3 세대가 있다 .
2세대 에서는 html css js 까지 구현하게 되고 ,
3 세대 에선 api 만 만들어 준다.

개인적으로 2세대가 아직 편한것 같다...

2세대 검색

class Book(models.Model):
    num = models.AutoField(primary_key=True)
    title = models.CharField(max_length=100, blank=True, null=True)
    author = models.CharField(max_length=100, blank=True, null=True)
    image = models.CharField(max_length=250, blank=True, null=True)
    url = models.CharField(max_length=250, blank=True, null=True)
    original_price = models.CharField(max_length=250, blank=True, null=True)
    sale_price = models.CharField(max_length=250, blank=True, null=True)

    class Meta:
        app_label = 'blog'
        db_table = 'book'
        
def book_search(request):
    if request.method == 'GET':

        client_id = ""
        client_secret = ""
        input_data = request.GET.get('input_search')
        encText = urllib.parse.quote("{}".format(input_data))
        if input_data is None:
            # print('데이터가없습니다.')
            encText = urllib.parse.quote("Django")
        url = "https://openapi.naver.com/v1/search/book?query=" + encText  # json 결과
        book_api_request = urllib.request.Request(url)
        book_api_request.add_header("X-Naver-Client-Id", client_id)
        book_api_request.add_header("X-Naver-Client-Secret", client_secret)
        response = urllib.request.urlopen(book_api_request)
        rescode = response.getcode()
        if (rescode == 200):
            response_body = response.read()
            result = json.loads(response_body.decode('utf-8'))
            items = result.get('items')
            print(result)  # request를 예쁘게 출력해볼 수 있다.

            return render(request, 'book_search.html', {'items': items})
 
templates 에서는 
    {% for item in items %}
를 사용해서 뿌려주고싶은거 뿌려주면 됨 

위의 내용은 2세대 이다 .

model 단에서 table 이름과 컬럼을 지정해준다.
그리고 views 단에서 화면에 뿌려줄것을 정하는데
open api 가 필요하니깐 우리의 착한 naver api 를 사용하면 된다.

위의 방식은 naver 에 있는 open api 를 적용한것이고 , 만약에 그게 아니라 게시판처럼 사용자가 입력한것에 대한 검색이 필요할 경우

이렇게 작성할 수 있겠다 .
어차피 이것도 body 로 오는것이기 때문에
request.GET.get 을 해주면 되고 ,
request.GET.get('q' , None) 으로 해줘도 무방하다.

3세대

class BestSearchView(View):

    def post(self, request):
        data = json.loads(request.body)
        print('data', data)

        if data['title'] is None or data['title'] == '':
            return JsonResponse({'message': 'NOT_FOUND'}, status=400)

        try:
            search_data = Kyobo.objects.values().filter(Q(title__icontains=data['title']))
            return JsonResponse({'title': list(search_data)}, status=200)
        except Kyobo.DoesNotExist:
            return JsonResponse({"message": "NOT_FOUND"}, status=200)

        # 내가 데이터를 뿌려줘야함
        return JsonResponse({'': ''}, status=200)

이렇게 작성하게 된다.
물론 이렇게해서 내가 templates 폴더를 만들고 나서 뿌려줄수 있다.
그럴꺼면 2세대 방식대로 하면된다.

첫번째 업데이트

class SearchView(View):

    def get(self, request):
        query = request.GET.get('search', None)
        if len(query) > 2:
            recipe_data = Recipe.objects.values().filter(Q(title__icontains=query))
            product_data = Product.objects.values().filter(Q(name__icontains=query))

            data={'product':[{
                'name':p['name'],
                'price':p['price'],
                'description':p['description'],
                'small_image':p['small_image'],
                }for p in product_data.values()],
                'recipe':[{
                'id':r['id'],
                'title':r['title'],
                'ingredient':r['ingredient'],
                'description':r['description'],
                'thumbnail_url':r['thumbnail_url'],
            }for r in recipe_data.values()]}

            return JsonResponse({"data":data},status=200)

출력값

두번째 업데이트


class SearchView(View):

    def get(self, request):
        query = request.GET.get('search', None)

        if len(query) > 2:
            recipe_data = Recipe.objects.filter(Q(title__icontains=query)).all()
            product_data = Product.objects.filter(Q(name__icontains=query)).select_related('harvest_year').all()


            data={'product':[{
                'id' : product.id,
                'name':product.name,
                'price':product.price,
                'description':product.description,
                'small_image':product.small_image,
                'harvest_year' : product.harvest_year.year,
                }for product in product_data],
                'recipe':[{
                'id':recipe.id,
                'title':recipe.title,
                'ingredient':recipe.ingredient,
                'description':recipe.description,
                'thumbnail_url':recipe.thumbnail_url,
            }for recipe in recipe_data]}


            return JsonResponse({'data':data},status=200)

http 보내기

https://velog.io/@swhybein/django-queryurl-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0

profile
꾸준함이란 ... ?

0개의 댓글