Django:覆盖保存(模型或管理部分)

时间:2016-01-21 19:08:07

标签: python sql django save models

我最近一直在玩Django,但是我仍然坚持如何解决这个问题。我有一个'人'模型,它与'凭证'模型有一对多的关系。现在该人员有一个配额,每次生成凭证时,配额将减少一个。我坚持的是通过save方法做到这一点。那怎么做呢?

以下是我的模特:

class Person(AbstractDetail):
# Note: Model to maintain information about Person
     vc = models.IntegerField(default = 3, verbose_name = 'Vouchers', 
     null = False, validators = [ validate_voucher ])

class Voucher(models.Model):
# Note: Model to maintain information about Voucher
     vc = models.CharField (max_length = 25, verbose_name = 'Voucher ID',
                     help_text = 'Voucher Identifier')
     ps = models.ForeignKey(Person, on_delete = models.CASCADE,
                       verbose_name = 'Person')

3 个答案:

答案 0 :(得分:2)

不要在var map = function( collection, callback ){ var result = []; each( collection, function(item){ result.push( callback( collection[item] ) ); }); return result; } 中这样做,它很容易搞乱django。尝试使用django信号save()

post_save()

检查django doc是否有django信号。

答案 1 :(得分:0)

我会略微打击一下,以避免重复凭证计数信息(称我为老式)。

我不会在Person.vc中保存凭证计数,而是在需要时通过在凭证对象管理器中为其创建函数来评估凭证计数:

def get_voucher_count(self, person):
    return self.filter(ps=person).count()

答案 2 :(得分:0)

好的,我设法解决了(在Shang Wang& Ytsen de Boer的帮助下,我也感激不尽)。我这样做的方法是创建一个对象Person的实例并在那里带走它。

幸运的是,我很快就检查了尚刚向我展示的文档(并且看起来更深)。以下是这样做的方法:

@receiver(post_save, sender = Voucher, dispatch_uid = "voucher_identifier")
def decrease_quota(sender, instance, **kwargs):
obj = Person.objects.get(pk = instance.ps.id)
if obj.vc < 4 and obj.vc > 0:
    obj.vc = obj.vc - 1
    obj.save()

当然,我必须做更多的事情(简单的验证和类似的东西),但这就是我需要它。