serializer.save()是原子的吗?

问题描述 投票:0回答:1
@api_view(["POST"])
def register_view(request: "Request"):
    serializer = RegisterSerializer(data=request.data)

    serializer.is_valid(raise_exception=True)

    try:
        serializer.save()
    except IntegrityError:
        raise ConflictException

    return Response(serializer.data, status=status.HTTP_201_CREATED)
class ConflictException(APIException):
    status_code = 409
    default_detail = "username is already taken"
    default_code = "conflict"
    def test_username_taken(self):
        with transaction.atomic():
            User.objects.create_user(username="customer4", password="Passw0rd!")

        response = self.client.post(
            "/register",
            {
                "username": "customer4",
                "password": "Passw0rd!",
                "confirm_password": "Passw0rd!",
                "phone_number": "13324252666"
            },
        )
        self.assertEqual(response.status_code, status.HTTP_409_CONFLICT)

测试结果显示:

引发事务管理错误( django.db.transaction.TransactionManagementError:当前事务中发生错误。在“原子”块结束之前您无法执行查询。

我是 Django 和 DRF 菜鸟,不知道该怎么办...

我在postman上测试没有问题,有409 status_code响应

django django-rest-framework atomic
1个回答
0
投票

409 状态代码用于指示与资源的当前状态发生冲突,例如在尝试创建或更新已存在或具有冲突信息的资源时。

我认为它已经存在。

所以我希望你暂时不要使用原子事务

并且 serilizer.save 不是 atmoic。

你可以像这样设置你的测试。

类 RegisterViewTests(APITestCase): def 设置(自身): self.client = APIClient() User.objects.create_user(用户名=“customer4”,密码=“Passw0rd!”)

def test_username_taken(self):
    response = self.client.post(
        "/register",
        {
            "username": "customer4",
            "password": "Passw0rd!",
            "confirm_password": "Passw0rd!",
            "phone_number": "13324252666"
        },
    )
    self.assertEqual(response.status_code, status.HTTP_409_CONFLICT)
© www.soinside.com 2019 - 2024. All rights reserved.