์ผ๋ถ ํ์ด ๋ค๋ฅธ ํ ๋์ ์ฌ๋ฌ ๋ฒ ๋ ๋๋ง๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฌธ์ ์ ํ ์ด๋ธ์ ์ด์ ๋ฒ์ ์ django ๋ฐ django-tables2์์ ์๋ฒฝํ๊ฒ ๋ ๋๋งํ๋ ๋ฐ ์ฌ์ฉ๋์์ต๋๋ค. ๋๋ ๋ ๋ค ๋์์ ์ต์ ๋ฒ์ (django 1.10, django-tables2 1.2.4)์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋๋ฐ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค.
๋ฐ๋ชจ๋ฅผ ๋ณด๋ ค๋ฉด ์ฌ๊ธฐ์์ ์ด ์ด๋ฏธ์ง๋ฅผ ์ฐธ์กฐํ์ญ์์ค: http://imgur.com/a/pPRT8
์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ์์๋ฅผ ์ ํํ์ง ์๊ณ ํ ์ด๋ธ์ ๋ก๋ํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํ์๋์ง ์์ต๋๋ค. ์ ๋ ฌ ์์๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ด ๋จธ๋ฆฌ๊ธ์ ํด๋ฆญํ๋ฉด ํ์ด ๋ณต์ ๋ฉ๋๋ค.
์ง๊ธ๊น์ง ์ค๋ณต๋ ํญ๋ชฉ ์์ด BoundRows ๊ฐ์ฒด์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๊ฐ ์ ํํ๋ค๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ธ๋ฉ๋ ํ์ ๋ฐ๋ณตํ๋ฉด ์ค๋ณต๋ ํญ๋ชฉ์ด ๋ฐํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐ๋ณต์ด ๋ฐ์ํ๋ ๋์ ๋ฐ์ดํฐ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด ๋ฌธ์ ๋ ๊ธธ์ด๊ฐ ~150์ธ ํ ์ด๋ธ์์ ๋ฐ์ํ๊ณ ์์ผ๋ฉฐ (์์ง) ๋ ์์ ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์์ต๋๋ค.
์ด ์ค๋ํซ์ ๋ฌธ์ ์ ์์ธ์ ์ขํ๋ ๋ฐ ์ฌ์ฉํ ํ ์คํธ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
--- a/django_tables2/rows.py
+++ b/django_tables2/rows.py
@@ -8,6 +8,7 @@ from django.utils import six
from .columns.linkcolumn import BaseLinkColumn
from .utils import A, AttributeDict, call_with_appropriate, computed_values
+import sys
class BoundRow(object):
"""
@@ -187,9 +188,17 @@ class BoundRows(object):
def __init__(self, data, table):
self.data = data
self.table = table
+ for d in data:
+ print >>sys.stderr, d
+
+ print >>sys.stderr, "end data"
+
def __iter__(self):
for record in self.data:
+ print >>sys.stderr, "__iter__", record
yield BoundRow(record, table=self.table)
list()๋ฅผ ํตํด ์ฟผ๋ฆฌ ์ธํธ๋ฅผ ๊ฒฐ์ ํํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
+++ b/django_tables2/rows.py
@@ -8,6 +8,7 @@ from django.utils import six
from .columns.linkcolumn import BaseLinkColumn
from .utils import A, AttributeDict, call_with_appropriate, computed_values
+import sys
class BoundRow(object):
"""
@@ -187,9 +193,26 @@ class BoundRows(object):
def __init__(self, data, table):
self.data = data
self.table = table
def __iter__(self):
+ print >>sys.stderr, type(list(self.data.data))
๋ณด๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ชฉ๋ก์ผ๋ก ์บ์คํ ํ๋ ๊ฒ์ ๋ ํฐ ๋ฐ์ดํฐ ์ธํธ์์๋ ์๋ํ์ง ์์ผ๋ฏ๋ก ์๋ฃจ์ ์ผ๋ก ํ์ฉ๋์ง ์์ต๋๋ค.
Django ๋ฒ์ ์ ๋ฐ์ดํธ์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด django-tables2 ๋ฒ์ ์ ๋ค์ด๊ทธ๋ ์ด๋ํ ์ ์์ต๋๊น?
์, ํ์คํ ํด๊ฒฐ์ฑ ์ ์๋์ง๋ง ์์ธ์ ๋ํ๋ผ ์ ์์ต๋๋ค. ๋ชฉ๋ก์ผ๋ก ์บ์คํ ํ๋ ๊ฒ์ด ์ ์ ํ ์๋ฃจ์ ์ด ์๋ ๋ค๋ฅธ ์ด์ ๋ ๊ทธ๊ฒ์ด ํญ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๋ ์ฟผ๋ฆฌ ์ธํธ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ self.data.data๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.
@wtfrank ,
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด ํ
์ด๋ธ์์ ํ๋์ ํ์ด ๋๋ฝ๋์๊ณ ๋ค๋ฅธ ํ๋๋ ์ค๋ณต๋์์ต๋๋ค... ์ ์๊ฒ ์ด๊ฒ์ ๋ฒ์ 1.2.2๋ถํฐ ์์๋์์ต๋๋ค.
1.2.1 "fixxes"๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. ๊ฒ์์ ๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์ ๊ณตํ ์ ์๋ ์ ๋ณด๊ฐ ์์ต๋๊น?
์ต์ํ์ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ git bisect๋ฅผ ์คํํ์ฌ ์๋ชป๋ ์ปค๋ฐ์ ์ฐพ์ ์ ์์ต๋๋ค.
ํ์ฌ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์กฐ์ฌํ๊ณ ์์ง๋ง ์ด์ํ๊ฒ๋ ํ ์คํธ ํ๊ฒฝ์์ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์์ต๋๋ค...
๋ก์ปฌ(sqlite๋ฅผ ์ฌ์ฉํ์ฌ ./manage runserver ์ฌ์ฉ)์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ํ๋ก๋์ (uwsgi ๋ฐ mysql ์คํ)์์๋ ์์์ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค...(๋ ํ๊ฒฝ ๋ชจ๋ ๋์ผํ ๋ฒ์ ์์ ์คํ๋จ)
์ฟผ๋ฆฌ ์ธํธ์๋ ์์์๊ฐ ํฌํจ๋์ด ์์ง ์์ต๋๋ค.... ๊ทธ๋ฌ๋ table.html์ด ๋ ๋๋ง๋ ๋ ์ฟผ๋ฆฌ ์ธํธ์๋ ํ๋์ ๊ฐ์ฒด๊ฐ ๋๋ฝ๋๊ณ ๋ค๋ฅธ ํ๋๋ ์ค๋ณต๋ฉ๋๋ค...
๊ณง ํ ์คํธ ์ผ์ด์ค๋ก ๋ค์ ๋์์ค๊ฒ ์ต๋๋ค :)
์ด ๋ฌธ์ ๋ 1.2.6 ๋ฒ์ ์์๋ ๋ฐ์ํฉ๋๋ค. # 329 ๋๋ # 330์ผ๋ก sth๋ผ๊ณ ์๊ฐํ์ง๋ง ์ง๊ธ๊น์ง ๊ณ ์น ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
๊ทธ๊ฒ๋ค์ 1.2.6์๋ง ์ ์ฉ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฒ๊ทธ์ ์์ธ์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ ์๊ฐํ์ง ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ์ฌํ ๊ฐ๋ฅํ ์ ์ ํ ์ฌ๋ก๋ฅผ ์ ๊ณตํ ์ ์์ง๋ง ๋ฐฉ๊ธ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ผ๋ฉฐ(๋๋ ์ ์ด๋ ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค) 1.2.1๊ณผ 1.2.2 ์ฌ์ด์ ํ์คํ ๋ฐ์ํ์์ ์ ์ ์์ต๋๋ค. .
1.2.1๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ ๋๋ง๋ค ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ ๋ณด์ ๋๋ค. 1.2.2 ์ด์์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ๋(๋ฌผ๋ก ์ต์ 1.2.6์ผ๋ก ์์ํ์ต๋๋ค), ์ผ๊ด๋๊ฒ ์ฒซ ๋ฒ์งธ ํ(DB์ ์๋ 3๊ฐ ์ค)์ ์๊ณ ๊ทธ ๋์ ๋ค๋ฅธ ํ์ ์ฌ๋ณธ์ ์ป์ต๋๋ค. ์๋ฅผ ๋ค์ด, 1.2.1์ ์์ ๋:
| ๋ ์ง | ํํธ | ... |
| --- | --- | --- |
| 2016-10-08 | 123 | ... |
| 2016-10-07 | 321 | ... |
| 2016-10-06 | 0 | ... |
1.2.2-1.2.6์์ ๋๋ ์ผ๊ด๋๊ฒ ์ด๊ฒ์ ๋์ ์ป์ต๋๋ค.
| ๋ ์ง | ํํธ | ... |
| --- | --- | --- |
| 2016-10-06 | 0 | ... |
| 2016-10-07 | 321 | ... |
| 2016-10-06 | 0 | ... |
์ ๋ Python 2.7.12์์ Django 1.9.9๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ํ๋ก์ ํธ๋ pydanny/cookiecutter-django๋ฅผ ์ฌ์ฉํ์ฌ ์์๋์์ผ๋ฉฐ(๊ทธ ์ดํ์ ํฌ๊ฒ ์์ ๋์์ง๋ง) ๋ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class DailySummaryTable(tables.Table):
class Meta:
model = DailySummary
attrs = {"class": "paleblue"}
empty_text = _("No stats yet")
fields = ("date", "hits", ...long boring list...)
# order_by = ("-date",)
# orderable = False
๋ชจ๋ธ์ Meta
์๋ verbose_name{,_plural}
์๊ณ ๋ณด๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ DetailView
์
๋๋ค.
class SourceDetailView(LoginRequiredMixin, DetailView):
model = Source
...
def get_context_data(self, **kwargs):
ctx = super(...)
ctx["stats"] = DailySummaryTable(DailySummary.objects.filter(source=self.object))
return ctx
๊ทธ๋ฆฌ๊ณ DB(PostgreSQL 9.6)์๋ ๋ชจ๋ ๋์ผํ source_id
(ํ๋๋ง ์์)๋ฅผ ๊ฐ๋ 3๊ฐ์ ํ์ด ์์ผ๋ฏ๋ก ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ผ์นํฉ๋๋ค. ์ด์ํ๊ฒ๋ .filter(source=...)
๋ฅผ .all()
๋ก ๋ฐ๊พธ๋ฉด ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๊ฒ ๋ด๊ฐ ์์๋ผ ์ ์๋ ์ ๋ถ์๋ค. ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ ์ง๊ธ 1.2.1์ ๊ณ ์ํ ๊ฒ ๊ฐ๋ค. :)
๋ฐฉํฉํ๋ ๋ชจ์ต์ ๋ณด์ฌ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋์ค์ ์ด ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฐฉ๊ธ ๊ฐ์ ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. list()๋ฅผ ํตํด ์ฟผ๋ฆฌ ์ธํธ๋ฅผ ๊ฒฐ์ ํํ๋ ๊ฒ์ ์ฐ๋ฆฌ ์ธก์์๋ ์คํ ๊ฐ๋ฅํ ์๋ฃจ์ ์ด ์๋๋๋ค.
@op-alex-reid๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ต์ํ์ ์ฌํ ๊ฐ๋ฅํ ํ ์คํธ ์ฌ๋ก๋ก ์ ํํ ์ ์์ต๋๊น?
๋ค์ ์ฝ๋์ ๋์ผํ ๋ฌธ์ (Django==1.9, django-tables==1.2.3)๊ฐ ์์ต๋๋ค.
class UserPlayerTable(tables.Table):
actions = tables.LinkColumn('player:my_players_detail', args=[A('slug')],
text=_('View / Edit'),
verbose_name=_('View / Edit'), empty_values=())
embed = tables.LinkColumn('player:my_players_embed', args=[A('slug')],
text=_('View / Embed now'),
verbose_name=_('View / Embed now'), empty_values=())
class Meta:
template = 'tables/table.html'
model = Player
fields = ('created', 'slug', 'actions', 'embed')
attrs = {"class": "changeset"}
order_by = ['-created']
orderable = False
๊ทธ๋ฆฌ๊ณ
UserPlayerTable(Player.objects.filter(user=context['impersonate_user']))
ํฅ๋ฏธ๋กญ๊ฒ๋ orderable = True
์ค์ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ list() ๋ฅผ ํตํด ์ฟผ๋ฆฌ ์ธํธ๋ฅผ ๊ฒฐ์ ํํ๋ ๊ฒ์ _is_ ์ต์ (์ง๊ธ์ ์์ ์ฌํญ)์ ๋๋ค. ํ ์ด๋ธ์ ์ต๋ 5๊ฐ์ ํ๋ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ฒ์ ์ฌํํด ๋ณด์์ต๋๋ค.
class Player(models.Model):
person = models.ForeignKey(Person)
created = models.DateTimeField(auto_now_add=True)
score = models.PositiveIntegerField()
def test_issue_361(per_page=5):
bob = Person.objects.create(first_name='Bob', last_name='Builder')
eve = Person.objects.create(first_name='Eve', last_name='Dropper')
for i in range(10):
Player.objects.create(person=bob, score=randint(0, 200))
Player.objects.create(person=eve, score=randint(200, 400))
Player.objects.create(person=bob, score=5)
Player.objects.create(person=eve, score=5)
class UserPlayerTable(tables.Table):
class Meta:
model = Player
fields = ('person.name', 'score',)
order_by = ['-score']
orderable = False
queryset = Player.objects.filter(score=5)
table = UserPlayerTable(queryset)
RequestConfig(request, paginate={'per_page': per_page}).configure(table)
html = table.as_html(request)
# count the number of rows, subtract one for the header
assert (html.count('<tr') - 1) == per_page
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ค๋ณต ๋ ํ์ ์์ฑํ์ง ์์ต๋๋ค ...
์ค๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ ๋ Django==1.10 ํ๋ก์ ํธ์์ django-tables2==1.2.9๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ django-filters==1.0.1๋ ์ฌ์ฉํฉ๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ ๋ด ํ ์ด๋ธ์ ํ์ด ๋ ๋ฐฐ๋ก ๋์ด๋๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค.
ํ์ํ ํญ๋ชฉ์ด ๋ง์ด ์์ต๋๋ค.
(๋ฐ๋ผ์ ํ์ด์ง๋น 25๊ฐ์ ๋ ์ฝ๋๋ก ํ์ด์ง ๋งค๊น์ ํ์ฑํํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ด์ง๋ง ์ ์ฒด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํ์ํ๋ฉด ๋์ผํ ํญ๋ชฉ์ด ์ฌ๋ฌ ๊ฐ ๋ํ๋ฉ๋๋ค.)
ํ
์ด๋ธ์ด ๋ฌธ์์ด์ด ์๋ ์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค.
(์๋ฅผ ๋ค์ด ์ด๋ฆ์ด ํฌํจ๋ ์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ข์ง๋ง ๋ ์ง, int ๋๋ bool์ด ์๋ ์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค)
1.2.1๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง๋ง ์ค์ ๋ก๋ ์ต์
์ด ์๋๋๋ค.
๊ฒ๋ค๊ฐ {{filter.qs.count}} ์นด์ดํธ๊ฐ ์์ด์ผ ํ๋ ๋๋ก์ด๊ธฐ ๋๋ฌธ์ ์์์๋ ์ค์ ํญ๋ชฉ ๋์ ํ์ ๋๊ณ ์ถ๊ฐ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
django-tables2๋ก ์์ ํ๋ ๊ฒ์ ์ฆ๊ธด๋ค๋ ์ ์ธ์๋ ์ด๊ฒ์ด ๋ฌธ์ ์ ํต์ฌ์ ํ์ ํ๋ ๋ฐ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ชจ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
@n0ctua ๊ฐ์ฌํฉ๋๋ค!
์คํ๋ ์ ํํ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๊ณ ์ฌ๊ธฐ์์ ๊ณต์ ํ ์ ์์ต๋๊น?
์ ๋ ๋ฐฉ๊ธ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช์๊ณ ์ ์ ์๊ฒ ์ด๋ฐ ์ผ์ด ์ผ์ด๋๋์ง ์ดํดํ์ต๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ ์ฌ๋๋ค๋ ๊ฐ์ ์ด์ ๋ก ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ ๊ฒ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. _(ํ์ง๋ง, ๋๋ django-tables2์ ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ์๋ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋์ง ์๋์ง ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํ๋ฆด ์ ์์ต๋๋ค... ๋น๋ก... ์ค์ ๋ก ๊ทธ๊ฒ์ ๋ํด ์๊ฐํด๋ณด๋ฉด ๋๋ ์ด๊ฒ์ด ์ด์ ๋ฒ์ ์์๋ ํ์ด์ง๊ฐ ๋งค๊ฒจ์ง์ง ์์ ํ ์ด๋ธ์ด ๊ฐ ํ์ ๋ํ ์ฟผ๋ฆฌ ๋์ DB์ ๋ํด ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ์๋์์...)_
๊ณ ์ ํ์ง ์์ ํ๋์ ๋ํ _SQL order by
๊ฒฐ์ ์ ์ด์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค_. ๋ฐ๋ผ์ top n
๊ฒฐํฉํ๋ฉด ๋์ผํ ์์ n๊ฐ ํ์ ๊ณ์ํด์ ์ป๊ฒ ๋ฉ๋๋ค. (๋ํ ์ด๋ค ์ด์ ๋ก ํ์ด์ง ๋งค๊น ์์ด Table
๋ฅผ ์์ฑํ๋ฉด _every_ row. IE top 1
๋ํ ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋ฉ๋๋ค.)
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ข์ ์๋ฃจ์
์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ด ์๋ํ๋๋ก ๋ณด์ฅํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ํญ์ ๋ง์ง๋ง order by
๊ฐ ๊ณ ์ ํ ํ๋์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ด์์ ์ผ๋ก๋ ๊ธฐ๋ณธ ํค? ๋ํ ์ด์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ๋ฌธ์์ ์ถ๊ฐํ ๊ฐ์น๊ฐ ์์ต๋๊น?
๋ณ๋์ ๋ฌธ์ ์ด์ง๋ง ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ๋ ๋น๋๋ฅผ ์ค์ด๊ณ ํ์ด์ง๊ฐ ๋งค๊ธฐ์ง ์์ ํ
์ด๋ธ์ ๋ํ ์ฟผ๋ฆฌ ์๋๋ฅผ ๋์ด๋ ๋ฌธ์ ๋ ํ
์ด๋ธ์ ๋ชจ๋ ํ์ ๋ํด top 1
์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๋์ ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ์
๋๋ค. ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ์
๋๋ค.
@intiocean ํ์ด์ง๊ฐ ๋งค๊ฒจ์ง์ง ์์ ํ ์ด๋ธ์ ๋ํ ์ด ์ฟผ๋ฆฌ ์๋ ๋งค์ฐ ์ด์ํฉ๋๋ค. ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ํ์คํ์ง ์์ผ๋ฉฐ ๋ฐ์ํด์๋ ์ ๋ฉ๋๋ค. ์ด ํ ์คํธ ์ผ์ด์ค๋ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
def test_single_query_for_non_paginated_table(settings):
'''
A non-paginated table should not generate a query for each row, but only
one query to count the rows and one to fetch the rows.
'''
from django.db import connection
settings.DEBUG = True
for i in range(10):
Person.objects.create(first_name='Bob %d' % randint(0, 200), last_name='Builder')
num_queries_before = len(connection.queries)
class PersonTable(tables.Table):
class Meta:
model = Person
fields = ('first_name', 'last_name')
table = PersonTable(Person.objects.all())
request = build_request('/')
RequestConfig(request, paginate=False).configure(table)
table.as_html(request)
# print '\n'.join(q['sql'] for q in connection.queries)
assert len(connection.queries) - num_queries_before == 2
์คํจํ ํ์ด์ง ๋งค๊น ์ฌ๋ก์ ๋ํ ํ ์คํธ๋ฅผ ๋ง๋ค๋ ค๊ณ ์๋ํ์ง๋ง ์คํจํ์ต๋๋ค. ์ ๊ทธ๋ฐ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ํ์ด์ง๊ฐ ๋งค๊ฒจ์ง ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๊ฒ์ด ์ ์์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค... ๊ณ ์ ํ์ง ์์ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ฉด ์ฌ๋ฌ ํ์ด์ง์ ๋ณต์ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํ์ ์ป์ ์ ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
@intiocean 10f5e968bc10552be0ad02ee566513b5d274d5c5๋ก ์์ ํ ๊ฒ ๊ฐ์์
@jieter ๋๋จํด! ํ์ด์ง๊ฐ ๋งค๊ฒจ์ง์ง ์์ ํ
์ด๋ธ์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ ์ด์ ๋ฅผ ์ ์ ์์ง๋ง ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ํ์ด์ง์ ๋ถ์ฐ๋์ด ์์ ๋ ๊ณ ์ ํ์ง ์์ ์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ฉด top n ... limit x offset y
๋ก ์ธํด ๋์ผํ ํ์ด ์ฌ๋ฌ ํ์ด์ง์ ๋ํ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ป๊ฒ ์๊ฐํ๋์?
@wtfrank , @intiocean @n0ctua @op-alex- reid @fliphess ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ผ๋ถ ์ปค๋ฐ์ ๋ง์คํฐ์ ํธ์ํ์ต๋๋ค. ํ์ธํ ์ ์์ต๋๊น?
@intiocean ์ด๊ฒ์ด ์ด ๋ฌธ์ ์ ์์ธ์ด๋ผ๋ฉด ์ด ๋์์ ๋ฌธ์ํํจ์ผ๋ก์จ ๋ถ๋ถ์ ์ผ๋ก๋ง ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด ํ์ด์ง ๋งค๊น๋์ง ์์ ํ ์ด๋ธ @jieter๋ฅผ ์์ ํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ํ ๊ฐ ํ์ ๋ํด ์ฟผ๋ฆฌ๊ฐ ํ๋๊ฐ ์๋ ํ๋์ ์ฟผ๋ฆฌ๋ง ์์ผ๋ฏ๋ก ํ์ด์ง๋ฅผ ๋งค๊ธฐ์ง ์์ ํ ์ด๋ธ์ ์ฑ๋ฅ๋ ํฅ์๋ฉ๋๋ค.
ํ์ธํ๋ค:
962f502 ๋ฐ '๋ฉ๋ชจ' ์ด ๊ธฐ์ค ์ ๋ ฌ -> ์ค๋ณต
f853078์ ์ฌ์ฉํ๊ณ '๋ฉ๋ชจ' ์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ -> ์ค๋ณต ์์ ๐
๋ฆด๋ฆฌ์ค @jieter๋ฅผ ํ ์ ์๋ ๊ธฐํ๊ฐ ์์ต๋๊น?
์ฐ์ ๋๋์ด ๊ณ ์ณ์ก๋ค!
๋ค, 1์๊ฐ ์ด๋ด์ ํ์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.
1.4.0 ์ถ์
๊ต์ฅํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค @jieter!
@jieter ์ @intiocean ๋ชจ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ด์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
์๋
ํ์ธ์, ๋ฐฉ๊ธ 1.21.2 ๋ฒ์ ๋ฐ Django==2.0.6์์ ์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค. intiocean
์ comment ๋๋ถ์ 'pk'๋ก ์ถ๊ฐ ์์๋ฅผ ์ค์ ํ์ฌ ์์ ํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฐ์ ๋๋์ด ๊ณ ์ณ์ก๋ค!
๋ค, 1์๊ฐ ์ด๋ด์ ํ์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.