在保存后添加行到表格内联... django-admin

时间:2014-04-06 22:28:04

标签: django django-models django-admin

首先要提前感谢您为全球社区提供的所有帮助,这是一项非常宝贵的服务。我把代码写成一个爱好,现在我想完成一个项目(我的第一个),我作为个人目标,并将帮助一个非营利组织,现在我发现自己处于某种尴尬的位置,因为英语不是我的母语,所以找到答案(可能已经在StackOverflow上)对我来说是一个问题。这也是我的第一个问题......希望做得好。 BTW Django太棒了......我有这两个模型:

# models.py
class CabMovimiento(InfoComun):

    """
    Guarda información de la cabecera de los movimientos
    internos de equipos, salvo préstamos. Hereda de
    InfoComun los campos.
    """

    nro = models.IntegerField(
        default=lambda: ult_nro_mov('cm'), verbose_name="Número", blank=True)
    det = models.ManyToManyField(
        'inventario.Equipo', through='DetMov', verbose_name="componente")

    class Meta:
        verbose_name = 'Movimiento Interno'
        verbose_name_plural = 'Movimientos Internos'

    def los_detalles(self):
        return "\n".join([d.serie for d in self.det.all().filter(self.id)])

    los_detalles.short_description = "Detalles"


class DetMov(models.Model):

    """
    Guarda el detalle de cada documento generado por los
    movimientos internos, a excepción de los préstamos.
    """

    cab = models.ForeignKey('CabMovimiento')
    eqp = models.ForeignKey('inventario.Equipo', verbose_name='Equipo/s')
    tip_mov = models.ForeignKey(
        'inventario.Tmetl',
        limit_choices_to={
            'asociacion': 'E', 'tipo': 'M'
        }, verbose_name='Tipo de Movimiento')
    for_mov = models.CharField(
        max_length=1, choices=fmov,
        default='U', verbose_name='Forma Movimiento')
    diag = models.CharField(max_length=80, verbose_name='Diagnóstico')

    class Meta:
        verbose_name = 'Detalle de Movimiento'
        verbose_name_plural = 'Detalles de Movimientos'

我已阅读并重新阅读django(1.5)关于信号,保存和保存相关方法的文档,我已经在这里和其他有趣的博客中遵循了几个教程,但我无法得到我想要的东西.... 我需要检测作为DetMov一部分的for_mov字段是否会改变值,类似于状态字段但是指的是移动某些东西的方式,并且可能是“U”,对于一个,或者&#39 ; C'完整的,指的是一组东西。

一旦检测到并且简单的移动(' U'),必须忽略更改或添加,但如果完全移动(' C'),您必须搜索数据库并向表格内联添加更多行并保存。我知道如何进行查询,但不知道如何添加它们......我认为我必须使用RAW Sql,虽然不太优雅,但不会丢弃。

对不起,如果它非常简单,如果你不明白我想要什么就很抱歉,因为我正在使用GTranslate。 TIA。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是覆盖save()上的DetMov方法,以便您获取最新值并检查它是否已更改。

def save(self, *args, **kwargs):
    if self.id and self.for_mov == 'C':
        stored_for_mov = DetMov.objects.get(id=self.id).values_list('for_mov', flat=True)[0]
        if stored_for_mov != self.for_mov:
            # The stored value isn't 'C'
            # Add the other records you need to.
    super(DetMov, self).save(*args, **kwargs)

我不太确定你是否需要在' U'的情况下阻止保存。我并没有真正遵循这一部分,但这应该可以帮助您解决您遇到的问题。您也可以将此全部转换为post_save信号。