[Django]filterによる検索

モデルにはobjects属性があり、その中にManagerというクラスのインスタンスが入っている
このManagerにfilter機能がある

/hello/urls.py

urlpatterns = [ 
	path('', views.index, name='index'),
	path('create', views.create, name='create'),
	path('edit/<int:num>', views.edit, name='edit'),
	path('delete/<int:num>', views.delete, name='delete'),
	path('list', FriendList.as_view()),
	path('detail/<int:pk>', FriendDetail.as_view()),
	path('find', view.find, name='find'), # 追加
]

/hello/forms.py

class FindForm(forms.Form):
	find = forms.CharField(label='Find', required=False, widget=forms.TextInput(attrs={'class':'form-control'}))

/hello/templates/hello/find.html

<body class="container">
	<h1 class="display-4 text-primary">{{title}}</h1>
	<p>{{message|safe}}</p>
	<form action="{% url 'find' %}" method="post">
		{% csrf_token %}
		{{ form.as_p }}
		<tr>
			<th></th><td><input type="submit" value="click" class="btn btn-primary mt-2"></td>
		</tr>
	</form>
	<table class="table">
		<tr>
			<th>id</th>
			<th>name</th>
			<th>mail</th>
		</tr>
	{% for item in data %}
		<tr>
			<td>{{item.id}}</td>
			<td>{{item.name}}({{item.age}})</td>
			<td>{{item.mail}}</td>
		</tr>
	{% endfor %}
	</table>
</body>

/hello/views.py

def find(request):
	if(request.method == 'POST'):
		form = FindForm(request.POST)
		find = request.POST['find']
		data = Friend.objects.filter(name=find)
		msg = 'Result: ' + str(data.count())
	else:
		msg = 'search words...'
		form = FindForm()
		data =Friend.objects.all()
	params = {
		'title': 'Hello',
		'message': msg,
		'form': form,
		'data': data,
	}
	return render(request, 'hello/find.html', params)

Friend.objects.filter(name=find)で指定している。

### 曖昧検索
– 値を含む検索: __contains=value
– 値で始まるもの: __startswith=value
– 値で終わるもの: __endswith=value

if(request.method == 'POST'):
		form = FindForm(request.POST)
		find = request.POST['find']
		data = Friend.objects.filter(name__contains=find)
		msg = 'Result: ' + str(data.count())

– 大文字小文字を区別しない: __iexact=value
– 曖昧検索: __icontains=value, __istartswith=value, __iendswith=value

### 数値の比較
– 等しい: =value
– 大きい: __gt=value
– 以上: __gte=value
– 小さい: __lt=value
– 以下: __lte=value

if(request.method == 'POST'):
		form = FindForm(request.POST)
		find = request.POST['find']
		data = Friend.objects.filter(age__lte=int(find))
		msg = 'Result: ' + str(data.count())

●●以上●●以下
split()は改行やスペースで分割する

	if(request.method == 'POST'):
		form = FindForm(request.POST)
		find = request.POST['find']
		val = find.split()
		data = Friend.objects.filter(age__gte=val[0], age__lte=val[1])
		msg = 'Result: ' + str(data.count())

### AとBどちらも検索
変数 = <<モデル>>.object.filter(Q(条件) | Q(条件))

from django.db.models import Q
// 
data = Friend.objects.filter(Q(name__contains=find)|Q(mail__contains=find))

### リストを使って検索

	if(request.method == 'POST'):
		form = FindForm(request.POST)
		find = request.POST['find']
		list = find.split()
		data = Friend.objects.filter(name__in=list)
		msg = 'Result: ' + str(data.count())

検索条件はアプリケーションの要件や機能によって変わってきますね。