我在我的django / satchmo继承的模型产品中做了一个pre_save信号,名为JPiece,我有一个名为JewelCategory的satchmo类别的另一个模型继承。 pre_save信号使JPiece对象获得类别列表,并将符合Jpiece描述的类别添加到关系中,这在模型中完成,这意味着如果我手动执行
p = Jpiece.objects.get(pk = 3) p.save()
保存类别并将其添加到p.category m2m关系中,但如果我从管理员处保存,则不会执行此操作...
我怎样才能实现这一点......从管理员那里保存JP并获得它所属的类别......
以下模型记住它们都具有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)
我知道我可能会模糊地解释有时候我需要什么,所以请随意提出任何问题我一定要尽快澄清,因为这是一个迫切需要这个的客户。
一如既往地谢谢大家......
答案 0 :(得分:1)
如果您使用pre_save
,则在 save()
之前称为,这意味着您无法定义m2m关系,因为该模型没有ID。
使用post_save
。
# this works because the ID does exist
p = Jpiece.objects.get(pk=3)
p.save()
更新,请在此处查看评论:Django - How to save m2m data via post_save signal?
现在看来,罪魁祸首就是使用管理员表单,save_m2m()
信号发生后会发生post_save
,这可能会覆盖您的数据。您可以从ModelAdmin
中的表单中排除该字段吗?
# django.forms.models.py
if commit:
# If we are committing, save the instance and the m2m data immediately.
instance.save()
save_m2m()