モデルには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())
検索条件はアプリケーションの要件や機能によって変わってきますね。