【问题标题】:How to restrict models foreign keys to foreign objects having the same property如何将模型外键限制为具有相同属性的外来对象
【发布时间】:2009-12-10 16:36:09
【问题描述】:

这是我的例子:

我们有打印机。我们可以定义链接到特定打印机的页面格式,然后定义选择起始格式(添加到打印作业的第一页)、正文格式和结束格式(添加到打印作业的最后一页)的工作流程。

Start 和 End 不是必需的(null 和空白 = True)

我想确保 start、body 和 end 是同一台打印机的格式。

class Printer(models.Model):
    name = models.CharField(max_length = 20)

class Format(models.Model):
    name = models.CharField(max_length = 20)
    format = models.TextField()
    printer = models.ForeignKey(Printer)

class Workflow(models.Model):
    name = models.CharField(max_length = 20)
    startfmt = models.ForeignKey(Format, related_name = 'start_workflow', null = True, blank = True)
    bodyfmt  = models.ForeignKey(Format, related_name = 'start_workflow')
    endfmt   = models.ForeignKey(Format, related_name = 'start_workflow', null = True, blank = True)

所以我需要这个模型来验证共享同一台打印机的 startfmt、bodyfmt 和 endfmt 参考格式...如何?

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您最好的选择可能是工作流模型中的overriding save

    class Workflow(models.Model):
        # field definitions as you have them
    
        def save(self, force_insert=False, force_update=False):
            printer = self.bodyfmt.printer
            if self.startfmt and self.startfmt.printer != printer:
                raise ValueError("Startfmt printer does not match")
            if self.endfmt and self.endfmt.printer != printer:
                raise ValueError("Endfmt printer does not match")
    
            super(Workflow, self).save(force_insert, force_update)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 2020-12-23
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2020-11-15
      相关资源
      最近更新 更多