代码之家  ›  专栏  ›  技术社区  ›  Ghislain Leveque

如何将模型外键限制为具有相同属性的外部对象

  •  0
  • Ghislain Leveque  · 技术社区  · 15 年前

    下面是我的例子:

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

    不需要开始和结束(空和空=真)

    我要确保开始、正文和结束都是同一打印机的格式。

    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引用格式…怎样?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Jarret Hardie    15 年前

    你最好的赌注可能是 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)