Django:如何从模型中验证 unique_together

2024-06-28

我有以下内容:

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'),) part?

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


有两种选择:

a) 有一个 try 块,用于保存模型并捕获 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() 方法中,检查 a 行是否存在并引发 aforms.ValidationError并附上适当的消息。例子here http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other.


所以,b)它是......这就是为什么我参考了文档;您需要的一切都在那里。 http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

但它会是这样的:

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

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

调用各个字段的所有 clean 方法后,将调用上面的 clean 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django:如何从模型中验证 unique_together 的相关文章

随机推荐

  • 如果我们不生成窗口,为什么定时器不起作用?

    这是代码 import java awt event ActionEvent import java awt event ActionListener import javax swing JFrame import javax swing
  • 在 django admin 中将 json 文本显示为友好列表

    我有一个 JSONField http djangosnippets org snippets 1478 http djangosnippets org snippets 1478 在模型中 我试图找出向管理员用户显示数据而不是 json
  • 如何从 JobDSL 脚本中访问 Jenkins 作业参数列表?

    我想保存传递到 JobDSL 作业的参数 我知道我可以引用各个参数 但我想让代码通用 我如何访问传递给作业的参数列表 当前的代码看起来像这样 final jobParameters new File parameters jobParame
  • 部署到 Heroku 时找不到“site”模块

    我正在尝试将 django 应用程序部署到 Heroku 但我不断收到错误 ImportError no module named site 我正在使用来自的自定义构建包https github com jiaaro heroku buil
  • 如何针对 Mac OS X 10.5 进行编译

    我想编译 10 5 及更高版本的应用程序 自从我升级到 Snow Leopard 并安装了最新的 XCode 后 gcc 默认为 10 6 我试过了 isysroot Developer SDKs MacOSX10 5 sdk但这似乎不起作
  • 使用 htaccess 禁用目录浏览

    在我的服务器中我有一系列文件夹 我会拒绝对所有这些文件夹的访问 我能怎么做 我必须使用什么规则 在 htaccess 根目录中添加一行 deny from all 问题 如果您想保留自己的访问权限 allow from 192 168 1
  • PrimeFaces 3.0.M3 单元编辑器不更新值

    我读过了there https stackoverflow com questions 6365877 cell edit in primefaces is not updating the value 6487361 6487361 但我
  • div 宽度,单位:厘米(英寸)

    我需要在每个显示器中放入宽度为 25 厘米 10 英寸 的站点 div 我怎样才能做到呢 您可以简单地使用cmCSS 中的单位 mydiv width 25cm 请注意 正如其他人指出的那样 结果仍然取决于操作系统对显示器尺寸的正确读取 S
  • 剥掉所有的身体标签而不毁掉他们的孩子

    此 Ruby 代码使用Nokogiri http nokogiri org doc xpath tbody remove 删除 的子项 tbody 以及 tbody 他们自己 我只想删除所有 tbody 文档中的标签 将其子项留在原处 我怎
  • HTML输入日期,如何减少日期和图标之间的间距?

    我需要压缩输入类型日期 所以我尝试将宽度设置为 120px 问题是有一个space日期数字和输入日期图标之间 我需要减少或删除该空间 有没有办法做到这一点 我的代码 顺便说一句 我正在使用 bootstrap 4
  • 你可以在 Android 中有意打开多个文件吗?

    我正在尝试在 Android Studio 中编写一个应用程序来打开多个音乐文件并存储它们的路径 目前我所做的只是一次加载一个文件 这不会出现任何问题 例如 下面的代码显示了我的加载按钮的 onclicklister 和相关代码 本示例的一
  • Java字符串对象的创建

    我一直在阅读 Java String 对象 并且有这个问题 String x a String y b 它在Java中创建两个对象吗 这两行代码不会创建任何对象 字符串文字 例如 a 被放入字符串池 https stackoverflow
  • enableHiveSupport 在 java Spark 代码中引发错误[重复]

    这个问题在这里已经有答案了 我有一个非常简单的应用程序 尝试使用 Spark 从 src main resources 读取 orc 文件 我不断收到此错误 无法实例化具有 Hive 支持的 SparkSession 因为找不到 Hive
  • 通过绑定启用 TabItem

    我想在不同页面是 TabItem 的应用程序中使用 MVVM 为此 我使用视图模型 项目 的可观察集合并将其绑定到选项卡控件 ItemSource 对于每个视图模型 我创建了一个单独的数据模板来呈现正确的视图 如下所示
  • 如何用惰性传播实现线段树?

    我在互联网上搜索了有关线段树的实现的信息 但在惰性传播方面却一无所获 之前有一些关于堆栈溢出的问题 但它们专注于解决 SPOJ 的一些特定问题 虽然我认为这是用伪代码对线段树的最好解释 但我需要用惰性传播来实现它 我发现以下链接 除了上面的
  • 用于 GNU C++ 的 SSE SSE2 和 SSE3 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一个简单的教程可以帮助我快速掌握 GNU C 中的 SSE SSE2 和 SSE3 如何在SSE中
  • 使用 Mathematica 在定义位置的左侧或右侧“StringCut”

    论读书这个问题 https stackoverflow com q 6052211 499167 我认为使用下面的问题会很简单StringSplit 给定以下字符串 我想将其 剪切 到每个 D 的左侧 以便 I get a List片段数
  • Google AppEngine Python 3.7 上的自定义库

    我正在尝试在 Google AppEngine Python 3 7 标准环境上部署一项服务 该环境需要一组库作为依赖项 无法部署依赖项之一 GDAL 2 2 2 并返回错误消息 File upload done Updating serv
  • 调用异步方法和 Task.Run 异步方法之间的区别

    我的视图模型中有一个方法 private async void SyncData SyncMessage syncMessage if syncMessage State SyncState SyncContacts this SyncCo
  • Django:如何从模型中验证 unique_together

    我有以下内容 class AccountAdmin models Model account models ForeignKey Account is master models BooleanField name models CharF