Do I need to explicitly use transactions with Djan

2019-01-20 05:00发布

问题:

According to http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations, in order to accept a nested serializer I need to create an update method. None of the examples use transactions although they do modify multiple rows/tables. Does the DRF somehow wrap things in transactions already, or should I explicitly put transaction.atomic() all over it?

Related PR:

  • https://github.com/tomchristie/django-rest-framework/pull/1787

回答1:

The related PR is unrelated to your question. PR is linked to the DRF specific exception handler that bypassed the default Django transaction scheme (https://github.com/tomchristie/django-rest-framework/pull/1204#issuecomment-52712621).

DRF doesn't specifically wrap things in a transaction to leave the users free to choose whatever they want to.



回答2:

You can also use Django's ATOMIC_REQUESTS database setting which will apply a transaction before the execution of each request and commit it if the request finishes successfully. More information here:

Database transactions - Tying transactions to HTTP requests



回答3:

first import transaction module from db, and then use the following

with transtaction.atomic():
    pass

This will ensure the atomicity and consistency of your data into database.