如何处理唯一的“单向”(源+目标)键约束

时间:2019-08-11 06:53:22

标签: django-models

我已经建立了这个模型(想象的链接不止E_HUSBAND_WIFE):

class EntityLink(models.Model):
    E_HUSBAND_WIFE = 1
    TAB_TYPES = {
        E_HUSBAND_WIFE: {'src': _("is the husband of"),
                         'dst': _("is the wife of"), },
    }
    link_type = models.IntegerField(
        choices=[(a, f'{b["src"]} ↔ {b["dst"]}') for a, b in TAB_TYPES.items()],
        default=None, blank=True, null=True)
    src = models.ForeignKey(User, on_delete=models.CASCADE,
                            related_name='src')
    dst = models.ForeignKey(User, on_delete=models.CASCADE,
                            related_name='dst')

    class Meta:
        # you cant have same relation between two entities twice:
        unique_together = ('src', 'dst', 'link_type')
  • 对于一个src和一个dst,我只能拥有一种关系。
  • 同一src和同一dst之间可以有多个关系。例如,一个src可以是dst的丈夫,但他也可以是teacher(代码中未显示)。

例如:

  • src = Garrydst = Roselink_type = E_HUSBAND_WIFE
  • 您无法添加其他src = Garrydst = Roselink_type = E_HUSBAND_WIFE

好!但是有一个问题:仅凭这些规则,您仍然可以添加新记录:

src = Rosedst = Garrylink_type = E_HUSBAND_WIFE

我要禁止这个!在插入/更新之前,如果(src, dst, link已经以(dst, src, link)的形式出现,我需要禁止这样做。

该怎么做?

0 个答案:

没有答案