0

ここに私のモデルがあります:

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変数は常に[].

ここで何が欠けていますか?

4

1 に答える 1

2

関数の最後のループでは、次のupdate_category_descendantsようにする必要があると思います。

for k, v in data.iteritems():
    k.descendants.add(*v)

Django の関連オブジェクト リファレンスも参照してください。

于 2012-07-28T15:09:22.717 に答える