介绍
目前python软件开发中django较为常用,而django和xadmin的结合大大节省了开发时间,加快开发效率。虽然如此,model操作仍然需要人为添加逻辑或者修改逻辑。万幸django提供了这个机制,方法是def save_models(self)
。该方法是用于django的model保存或者修改时带入个人逻辑而可以重载的方法。
示例如下:
需求
Dayneed表在新增时需要向Account表添加数据,在修改时向Account表修改数据。假设添加数据为dayneed的extend值全加到Account的extend值里,假设修改数据为将dayneed的旧extend值从Account的extend值里减去,并将dayneed的新extend值添加到Account的extend值中。
逻辑
def save_models(self):
path = self.request.path
if path.split('/')[-2] == 'update':
obj = self.new_obj
oldextend = Dayneed.objects.filter(id=obj.id)[0].extend
curtime = obj.time
money = obj.extend
acs = Account.objects.filter(time=curtime)
if acs:
acc = acs[0]
acc.extend -= oldextend
acc.extend += money
acc.save()
else:
acc = Account()
acc.extend = money
acc.save()
obj.save()
else:
obj = self.new_obj
curtime = obj.time
money = obj.extend
obj.save()
acs = Account.objects.filter(time=curtime)
for acc in acs:
if acc is None:
acc.extend = money
acc.save()
else:
acc.extend += money
acc.save()
if not acs:
acc = Account()
acc.time = curtime
acc.extend = money
acc.save()
描述
self.new_obj是已经实例化的带有新增或者修改数据的Dayneed对象。
Dayneed.objects.filter(id=obj.id)是查找数据库中与目前修改后但是并未保存到数据库中的Dayneed表是同一数据的旧Dayneed表。
obj.save()是保存当前修改或者新增的Dayneed表。
结论
经过以上叙述,说明save_models的逻辑可以操作。在使用任何源码时应有无所畏惧的心理和敢于实践的能力。