使用 Django 表单集保存具有唯一属性的多个对象

2024-04-25

TL;DR:如何使用表单集保存/验证具有唯一属性的多个对象?

假设我有一个Machine其中有多个Settings(参见下面的型号)。这些设置在机器内应具有唯一的顺序。这可以通过定义一个来完成unique_together属性中的Meta的类别Setting model:

unique_together = (('order', 'machine'), )

但是,我使用内联表单集来更新所有Settings of a Machine。假设我的表单集中有以下信息:

  • 设置1:机器=1;订单=1
  • 设置2:机器=1;订单=2

如果我要调换两者的顺序Settings:

  • 设置1:机器=1;订单=2
  • 设置2:机器=1;订单=1

并使用以下代码保存表单:

self.object = machine_form.save()
settings = setting_formset.save(commit=False)
for setting in settings:
    setting.machine = self.object
    setting.save()

然后我收到一个唯一约束错误,因为我尝试使用 order=2 保存设置 1,但设置 2 仍然具有该顺序。我似乎无法找到解决这个问题的干净解决方案。我想保留unique_together约束以确保我的数据的正确性。我知道如何使用 Javascript 在前端解决这个问题,但我想检查我的模型/表单。循环遍历表单集行似乎是可能的,但是很难看?

class Machine(models.Model):
    name = models.CharField(max_length=255)

class Setting(models.Model):
    name = models.CharField(max_length=255)
    machine = models.ForeignKey(Machine, on_delete=models.CASCADE)
    order = models.PositiveSmallIntegerField()

似乎不可能在数据库级别限制顺序。我并不是说这是不可能的,但我不知道如何做到。

现在,我在表单集中添加了一个检查。如果有人遇到类似的问题,我会将其留在这里。

class BaseSettingFormSet(BaseInlineFormSet):
    '''FormSet to update the order of Settings in a Machine'''

    def clean(self):
        '''Checks if there are no two Settings with the same order.'''
        if any(self.errors):
            return
        orders = []
        for form in self.forms:
            if form.cleaned_data:
                order = form.cleaned_data['order']
                if order in orders:
                    form.add_error('order', _('The order of each setting must be unique'))
                else:
                    orders.append(order)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Django 表单集保存具有唯一属性的多个对象 的相关文章

  • 无法安装 psycopg2 Ubuntu

    试图为 django 项目准备好服务器 但我在设置 postgres 时遇到了一些问题 我正在遵循本指南 https jee appy blogspot com 2017 01 deply django with nginx html ht
  • 当 DetailView 遇到时更新模型字段。 [姜戈]

    我有一个类似的 DetailViewviews py views py class CustomView DetailView context object name content model models AppModel templa
  • 如何将 pytest 装置与 django TestCase 一起使用

    我如何在TestCase方法 类似问题的几个答案似乎暗示我的例子应该有效 import pytest from django test import TestCase from myapp models import Category py
  • 防止 Celery Beat 运行相同的任务

    我有一个计划的 celery 每 30 秒运行一次任务 我有一个每天作为任务运行 另一个每周在用户指定的时间和一周中的某一天运行 它检查 开始时间 和 下一个预定日期 在任务完成之前 下一个计划日期不会更新 但是 我想知道如何确保 cele
  • 尝试从 Django 模板更改语言时出现问题

    我需要包含两个按钮或链接以允许用户在英语和西班牙语之间更改语言 我读了the docs https docs djangoproject com en 1 5 topics i18n translation the set language
  • 扩展 Django 1.11 用户模型

    我正在尝试弄清楚如何扩展 Django 用户模型以向用户添加信息 我似乎无法让它发挥作用 我究竟做错了什么 我可以在扩展的同一模型中使用外键吗 如何创建超级用户 还是必须通过手动创建python manage py shell 到目前为止
  • Django 自定义 UserManager 中的 self.model()

    所以 我对 Django 还很陌生 尽管我的代码在遵循 Django 文档 在 Django 中自定义身份验证 之后工作 但我不明白他们的示例中的 self model 实际如何工作 它来自哪里以及它如何与 自己 这是在文档底部找到的示例
  • DRF:以编程方式从 TextChoices 字段获取默认选择

    我们的网站是 Vue 前端 DRF 后端 在一个serializer validate 方法 我需要以编程方式确定哪个选项TextChoices类已被指定为模型字段的默认值 TextChoices 类 缩写示例 class PaymentM
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • 在身份验证上运行 Django 测试时出现“重复键值”错误

    我有一个运行良好的 Django 网站 它的数据库中有少量数据 我想用它来进行测试 我已经完成了 dumpdata 来生成一些 json 固定装置 但是 当我尝试在我的应用程序 tagger 上运行测试时 我收到 Postgresql 错误
  • “以 10 为基数的 int() 的文字无效:”但不明白为什么它要访问整数

    我不明白为什么在我的应用程序中出现此错误 由于所有主键都是文本字段 因此都是整数 这是我的代码 forms py class EventAttendForm forms Form talk forms ModelChoiceField qu
  • 带有redirect_uri的social-auth-app-django Facebook后端状态

    我知道我的问题听起来像是重复的 但我到处寻找但没有找到任何解决方案 我正在努力为我的 django web 应用程序实现社交登录 到目前为止 谷歌 推特和雅虎登录均按预期工作 但facebook总是给出以下错误 URL 被阻止 此重定向失败
  • 运行 Django 测试时如何将 DEBUG 设置为 True?

    我目前正在运行一些 Django 测试 看起来DEBUG False默认情况下 有没有办法运行我可以设置的特定测试DEBUG True在命令行还是在代码中 对于测试用例内的特定测试 您可以使用 override settings 装饰器 f
  • 访问 Scrapy 内的 django 模型

    是否可以在 Scrapy 管道内访问我的 django 模型 以便我可以将抓取的数据直接保存到我的模型中 我见过this https scrapy readthedocs org en latest topics djangoitem ht
  • 使用 django-filters 设置初始值?

    当使用Django 过滤器 https django filter readthedocs orgapp 如何设置过滤器中字段的初始值 通常采用标准形式Django 例如一个简单的选择列表形式 class MyForm forms Form
  • ManyRelatedManager 对象不可迭代

    尝试这样做 wishList WishList objects get pk 20 matches val for val in Store attribute answers all if val in wishList attribut
  • 如何使用 django 过滤器 icontains 获取多个字段

    我正在尝试将查询搜索与所有模型字段进行比较 但我不知道如何在多个字段中执行此操作 这是我的代码 expense Expense objects filter user request user id order by date q requ
  • 无法使用 django-mssql 提供程序

    有谁知道如何使用 django mssql 提供程序 我已经安装了要求 但无法让它工作 如果 settings py 中没有 sqlserver ado 它可以正常导入 testenv C Users Robin test gt pytho
  • Mac 上的 GeoDjango 和 Spatialite:C 扩展加载问题

    我正在关注GeoDjango 教程 https docs djangoproject com en dev ref contrib gis tutorial 在我的家用计算机 运行 OSX 10 8 2 的 Mac Mini 上为我的项目设
  • 让 Django 提供可下载文件

    我希望网站上的用户能够下载路径被遮挡的文件 因此无法直接下载它们 例如 我希望 URL 是这样的 http example com download f somefile txt 在服务器上 我知道所有可下载的文件都位于该文件夹中 home

随机推荐