[Django]モデルのカスタマイズ

### モデルのリストを調査
/hello/views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Friend

def index(request):
	params['data'] = Friend.objects.all()
	params = {
		'title': 'Hello',
		'data': data,
	}		
	return render(request, 'hello/index.html', params)

/hello/templates/hello/index.html

from django.shortcuts import render
from django.http import HttpResponse
from .models import Friend

def index(request):
	data = Friend.objects.all()
	params = {
		'title': 'Hello',
		'data': data,
	}		
	return render(request, 'hello/index.html', params)

– .objects.all()で取り出していたのはQuerySetというインスタンスだということがわかる
– QuerySetには__str__も含む

### valuesメソッド
– .objects.values()で辞書でデータを取り出すことができる
/hello/views.py

def index(request):
	data = Friend.objects.values()
	params = {
		'title': 'Hello',
		'data': data,
	}		
	return render(request, 'hello/index.html', params)

– 特定の項目を指定

def index(request):
	data = Friend.objects.values('id', 'name')
	params = {
		'title': 'Hello',
		'data': data,
	}		
	return render(request, 'hello/index.html', params)

– リストとして取り出す

data = Friend.objects.all().values_list('id', 'name','age')

– first最初、last最後、countレコード数

def index(request):
	num = Friend.objects.all().count()
	first = Friend.objects.all().first()
	last = Friend.objects.all().last()
	data = [num, first, last]
	params = {
		'title': 'Hello',
		'data': data,
	}		
	return render(request, 'hello/index.html', params)

– QuerySetのカスタマイズ

from django.shortcuts import render
from django.http import HttpResponse
from .models import Friend
from django.db.models import QuerySet

def __new_str__(self):
	result = ''
	for item in self:
		result += '<tr>'
		for k in item:
			result += '<td>' + str(k) + '=' + str(item[k]) + '</td>'
		result += '</tr>'
	return result

QuerySet.__str__ = __new_str__

def index(request):
	data = Friend.objects.all().values('id', 'name', 'age')
	params = {
		'title': 'Hello',
		'data': data,
	}		
	return render(request, 'hello/index.html', params)
<body class="container">
	<h1 class="display-4 text-primary">{{title}}</h1>
	<table class="table">
		{{data|safe}}
	</table>
</body>

reverseなどもviews.pyで整形すれば良いのですね、少しイメージが湧いてきました。