gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:08:27 26 4
gpt4 key购买 nike

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

假设我有一个 Machine其中有多个 Setting s(见下面的模型)。这些设置在机器内应该有唯一的顺序。这可以通过定义 unique_together 来实现。 Meta 中的属性Setting 类模型:

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

但是,我使用内联表单集来更新所有 Setting的一个 Machine .假设我的表单集中有以下信息:
  • 设置1:机器=1;订单=1
  • 设置2:机器=1;订单=2

  • 如果我在两个 Setting上切换顺序s:
  • 设置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)

    关于django - 使用 Django 表单集保存具有唯一属性的多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46484564/

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