gpt4 book ai didi

python - Django:如何从模型中验证 unique_together

转载 作者:行者123 更新时间:2023-11-28 20:00:01 29 4
gpt4 key购买 nike

我有以下内容:

class AccountAdmin(models.Model):

account = models.ForeignKey(Account)
is_master = models.BooleanField()
name = models.CharField(max_length=255)
email = models.EmailField()

class Meta:
unique_together = (('Account', 'is_master'), ('Account', 'username'),)

如果我随后在同一帐户上使用与另一个用户名相同的用户名创建一个新的 AccountAdmin,它不会给我一个错误来显示在模板中,它会因 IntegrityError 而中断并且页面消失。我希望在我看来,我可以去:

if new_accountadmin_form.is_valid():
new_accountadmin_form.save()

我如何克服这个问题。是否有第二种 is_valid() 类型的方法检查数据库是否违反 unique_together = (('Account', 'is_master'), ('Account', 'username') ,) 部分?

我不想在我看来必须捕获 IntegrityError。那是混合了表示逻辑的领域逻辑。它违反了 DRY,因为如果我在 2 页上显示相同的表单,我将不得不重复相同的 block 。它还违反了 DRY,因为如果我对同一事物有两种形式,我必须写相同的 except: again。

最佳答案

有两种选择:

a) 有一个 try block ,您可以在其中保存模型并捕获 IntegrityError 并进行处理。像这样的东西:

try:
new_accountadmin_form.save()
except IntegrityError:
new_accountadmin_form._errors["account"] = ["some message"]
new_accountadmin_form._errors["is_master"] = ["some message"]

del new_accountadmin_form.cleaned_data["account"]
del new_accountadmin_form.cleaned_data["is_master"]

b) 在表单的 clean() 方法中,检查该行是否存在并引发 forms.ValidationError 并提供适当的消息。示例 here .


所以,b) 它是……这就是为什么我 referenced the documentation; all you need is there.

但它会是这样的:

class YouForm(forms.Form):
# Everything as before.
...

def clean(self):
""" This is the form's clean method, not a particular field's clean method """
cleaned_data = self.cleaned_data

account = cleaned_data.get("account")
is_master = cleaned_data.get("is_master")
username = cleaned_data.get("username")

if AccountAdmin.objects.filter(account=account, is_master=is_master).count() > 0:
del cleaned_data["account"]
del cleaned_data["is_master"]
raise forms.ValidationError("Account and is_master combination already exists.")

if AccountAdmin.objects.filter(account=account, username=username).count() > 0:
del cleaned_data["account"]
del cleaned_data["username"]
raise forms.ValidationError("Account and username combination already exists.")

# Always return the full collection of cleaned data.
return cleaned_data

它的值(value) - 我刚刚意识到您上面的 unique_together 引用了一个名为 username 的字段,该字段未在模型中表示。

上面的 clean 方法在调用了各个字段的所有 clean 方法之后调用。

关于python - Django:如何从模型中验证 unique_together,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1923826/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com