pre_save()の動作

django Published at March 6, 2025, 8:23 a.m. by admin@senrigan.org

何やってるかよくわからなかったので動作を追った。

self
<course.fields.OrderField: order>

self.model
<class 'course.models.Module'>

self.attname
'order'

qs = self.model.objects.all()
<QuerySet [<Module: 0.数と式>, <Module: 1.方程式と不等式>, <Module: 2.2次関数>]>

query = {field: getattr(model_instance, field) for field in self.for_fields}
{'course': <Course: 数Ⅰ>}

qs.filter(**query)
<QuerySet [<Module: 0.数と式>, <Module: 1.方程式と不等式>, <Module: 2.2次関数>]>

item = qs.filter(**query).latest(self.attname)
<Module: 2.2次関数>

getattr(item, self.attname)
2

item
<Module: 2.2次関数>

item.order
2

getattrってrubyのObject#sendみたいなものか。リスト内包表記でfor_fieldsの要素一個ずつ取り出して、後でfiliter()に渡すのでfieldをキーにしてdict{}に保存してる。それでModule/Contentの一番最後のオブジェクトのorder調べて、その次に表示したいので+1にしてるのね。

参考:Django 5 by Example