django 에서 2 세대와 3 세대가 있다 .
2세대 에서는 html css js 까지 구현하게 되고 ,
3 세대 에선 api 만 만들어 준다.
개인적으로 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) 으로 해줘도 무방하다.
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)
https://velog.io/@swhybein/django-queryurl-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0