from django.db import transaction
两种方式控制事务:为了保持数据一致性
一个Book表,一个Author表。添加一本书,也要保证添加作者。By事物控制
book = Book.object.get(id=1) # 单个Book.object
book.字段.find('a') # 查询该字段是否包含'a' ,不包含返回 -1,包含返回 >=0
一:装饰器
只能装饰app下的View中的def方法。
@transaction.atomic def forTransaction(request): """ 事物装饰器transaction.atomic """ author = Author.objects.create(name='xixi1') book = Book.objects.create(headline='练习事物22') author.book.add(book)
author,save() # assert not book.headline.find("事物") >=0, "敏感信息" if book: raise Exception("强行错误") # 有错误就都不执行 return HttpResponse("ojbk")
二:使用上下文管理器的方式
在view中,使用 with transaction.atomic():
class ForTransaction(View): ''' 使用上下文管理器,管理事务 ''' def get(self, request): with transaction.atomic(): author = Author.objects.create(name='haha1') book = Book.objects.create(headline='upDown') author.book.add(book) # add 多对多关系使用 author.save() assert not book.headline.find("up") >=0, "敏感信息" #包含‘up’返回>=0的值,则报错。 有错误就都不执行 return HttpResponse('ojbk')