Django автокатегоризация в поле m2m - PullRequest
0 голосов
/ 18 марта 2011

Я выполнил сигнал pre_save в моей унаследованной модели Product django / satchmo под названием JPiece, и у меня есть еще одно наследование модели из категории satchmo под названием JewelCategory. Сигнал pre_save заставляет объекты JPiece получать список категорий и добавлять те категории, которые соответствуют описанию Jpiece, в отношение, которое выполняется в модели, то есть, если я вручную сделаю

p = Jpiece.objects.get (pk = 3) p.save ()

Категории сохраняются и добавляются в отношение p.category m2m, но если я сохраняю их от администратора, это не происходит ...

Как мне этого добиться ... чтобы сохранить от администратора JPiece и получить категории, к которым он принадлежит ...

Вот модели, помните, что они обе имеют наследование модели от классов продукта и категории satchmo.

class Pieza(Product):
    codacod = models.CharField(_("CODACOD"), max_length=20,
        help_text=_("Unique code of the piece. J prefix indicates silver piece, otherwise gold"))
    tipocod = models.ForeignKey(Tipo_Pieza, verbose_name=_("Piece Type"),
        help_text=_("TIPOCOD"))
    tipoenga = models.ForeignKey(Engaste, verbose_name=_("Setting"),
        help_text=_("TIPOENGA"))
    tipojoya = models.ForeignKey(Estilos, verbose_name=_("Styles"),
        help_text=_("TIPOJOYA"))
    modelo = models.CharField(_("Model"),max_length=8,
        help_text=_("Model No. of casting piece."),
        blank=True, null=True)



def autofill(self):
    #self.site = Site.objects.get(pk=1)
    self.precio = self.unit_price
    self.peso_de_piedra = self.stone_weigth
    self.cantidades_de_piedra = self.stones_amount
    self.for_eda = self.for_eda_pieza
    if not self.id:
        self.date_added = datetime.date.today()
        self.name = str(self.codacod)
        self.slug = slugify(self.codacod, instance=self)

    cats = []
    self.category.clear()

    for c in JewelCategory.objects.all():
        if not c.parent:
            if self.tipocod in c.tipocod_pieza.all():
                cats.append(c)
        else:
            if self.tipocod in c.tipocod_pieza.all() and self.tipojoya in c.estilo.all():
                cats.append(c)

    self.category.add(*cats)

def pieza_pre_save(sender, **kwargs):
    instance = kwargs['instance']
    instance.autofill()
#    import ipdb;ipdb.set_trace()

pre_save.connect(pieza_pre_save, sender=Pieza)

Я знаю, что иногда могу быть неясным с объяснениями того, что мне нужно, поэтому, пожалуйста, не стесняйтесь спрашивать что-либо. Я обязательно уточню как можно скорее, поскольку это клиент, который нуждается в этом срочно.

Спасибо всем как всегда ...

1 Ответ

1 голос
/ 18 марта 2011

Если вы используете pre_save, он называется до save(), что означает, что вы не можете определить отношения m2m, так как модель не имеет идентификатора.

Использовать post_save.

# this works because the ID does exist
p = Jpiece.objects.get(pk=3) 
p.save()

Обновление, ознакомьтесь с комментарием здесь: Django - Как сохранить данные m2m с помощью сигнала post_save?

Похоже, виновник теперь в том, чтос помощью формы администратора, после сигнала post_save происходит save_m2m(), который может перезаписывать ваши данные.Можете ли вы исключить поле из формы в вашем ModelAdmin?

# django.forms.models.py
if commit:
    # If we are committing, save the instance and the m2m data immediately.
    instance.save()
    save_m2m()
...