ここに私のモデルがあります:
class MediumCategory(models.Model):
name = models.CharField(max_length=100, verbose_name=u"Nazwa")
slug = models.SlugField(blank=True)
parent = models.ForeignKey('self', blank=True, null=True, verbose_name=u"Rodzic")
parameters = models.ManyToManyField(AdvertisementDescriptonParameter, blank=True)
count_mediums = models.PositiveIntegerField(default=0)
count_ads = models.PositiveIntegerField(default=0)
descendants = models.ManyToManyField('self', blank=True, null=True)
def save(self, *args, **kwargs):
self.slug = slugify("%s_%s" % (self.id, self.name))
super(MediumCategory, self).save(*args, **kwargs)
def __unicode__(self):
return unicode(self.name)
これが私の管理者です:
class MediumCategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'parent', 'count_mediums', 'count_ads']
def save_model(self, request, obj, form, change):
admin.ModelAdmin.save_model(self, request, obj, form, change)
update_category_descendants()
そしてここに関数があります:
def update_category_descendants(sender=None, **kwargs):
data = dict()
def children_for(category):
return MediumCategory.objects.filter(parent=category)
def do_update_descendants(category):
children = children_for(category)
descendants = list() + list(children)
l = list([do_update_descendants(child) for child in children])
for descendants_part in l:
descendants += descendants_part
if category:
data[category] = []
for descendant in descendants:
data[category].append(descendant)
return list(descendants)
# call it for update
do_update_descendants(None)
for k, v in data.iteritems():
k.descendants = v
print k, k.descendants.all()
つまり、ツリー内のノードのすべての子孫を取得し、それをこのノードのリストにupdate_category_descendants
保存します。descendants
店舗で分類された製品を閲覧するのに役立ちます。
期待どおりにprint k, k.descendants.all()
動作しますが、実際にはデータは db に保存されません。
私がする時:
def category(request, category_slug, page=None):
cats = MediumCategory.objects.all()
category = MediumCategory.objects.get(slug=category_slug)
descendants = category.descendants.all()
print "category, descendants", category, descendants
descendants
変数は常に[]
.
ここで何が欠けていますか?