我正在从 Pydantic v1 迁移到 v2,并尝试用 @field_validator 替换已弃用的 @validator 的所有使用。
以前,我使用values验证器函数的参数来引用其他先前验证的字段的值。正如v1 文档所说:
您还可以将以下参数的任意子集添加到签名中(名称必须匹配):
- 值:包含任何先前验证的字段的名称到值映射的字典
由于签名已更改,此参数似乎values不再被传递。但是,迁移文档没有提及v2 中的等效项,并且 v2 验证器文档页面尚未针对 v2.0 进行更新。@field_validatorvalues
有谁知道 v2 的首选方法?
V1验证器:
@validator('password2')
def passwords_match(cls, v, values, **kwargs):
if 'password1' in values and v != values['password1']:
raise ValueError('passwords do not match')
return v
Run Code Online (Sandbox Code Playgroud) 我已经被这个问题困扰了几个小时。我是 django 和自动化测试的新手,我一直在使用 Selenium 和 django 的 StaticLiveServerTestCase。我一直在尝试测试我的登录表单(顺便说一句,当我使用 runserver 并自己测试它时,它工作得很好。)
一切工作都很好,除了我似乎无法成功登录我的测试用户。我已将断点范围缩小到 django 的 User.authenticate 方法。
User 对象在我的设置中已成功创建,我可以通过在测试方法中访问它的属性来确认这一点。但是,身份验证失败。
我查看了以下内容以寻求帮助,但他们并没有让我走得太远:
知道为什么身份验证失败吗?我需要在设置中添加一些内容吗?
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
class AccountTestCase(StaticLiveServerTestCase):
def setUp(self):
self.selenium = webdriver.Chrome()
super().setUp()
User.objects.create(username='test', email='test@test.com', password='Test1234', is_active=True)
def tearDownClass(self):
self.selenium.quit()
super().tearDown()
def test_register(self):
user = authenticate(username='test', password='Test1234')
if user is not None: # prints Backend login failed
print("Backend login …Run Code Online (Sandbox Code Playgroud) 我正在从 Pydantic v1 迁移到 v2,并尝试将已弃用 @validator的所有用途替换为@field_validator.
但是,我之前使用过pre 验证器参数,在转到 后@field_validator,我收到以下错误:
TypeError: field_validator() got an unexpected keyword argument 'pre'
Run Code Online (Sandbox Code Playgroud)
V2 中是否也已弃用 pre 的使用?尽管有页面顶部警告,但V2 验证器文档中似乎仍然引用了它:
此页面仍需要更新 v2.0。
希望其他人已经解决了这个问题并可以提出最佳的前进路线。谢谢!