【问题标题】:Django, How to enforce model Foreinkeys to have same valueDjango,如何强制模型 Foreinkeys 具有相同的值
【发布时间】:2019-01-04 22:11:36
【问题描述】:

在 Django 中,我想强制一个模型具有两个不同模型的前键,这些模型具有相同类型的字段是相同的,例如:

class Model1(models.Model):
    f1 = models.CharField(max_length=48)

class Model2(models.Model):
    f1 = models.CharField(max_length=48)

class Model3(models.Model):
    field1 = models.ForeignKey(Model1)
    field2 = models.ForeignKey(Model2)

我希望只有在 Model1 和 Model2 的 f1 字段相同时才能创建 Model3 的对象。 (编辑:请注意,每个模型都有其他与问题无关的字段)

【问题讨论】:

  • 在这种情况下,我认为您的建模有点“偏离”,因为这看起来像 数据重复
  • 嗨,在我的真实模型中,每个模型都有其他与其他模型无关的字段,这些字段与那里的问题无关,因为我没有提到它们
  • 但是您可能应该在单独的模型中排除这个字段。

标签: django


【解决方案1】:

我相当肯定这在 db 级别是不可能的。但是,您可以通过预保存信号轻松地在代码级别强制执行它。 django 中的预保存信号允许您在模型实际保存到数据库之前执行操作/检查。

请参阅下面的示例了解潜在的解决方案。

from django.db.models.signals import pre_save

@receiver(pre_save)
def pre_save_handler(sender, instance, *args, **kwargs):
  if instance.field1.f1 != instance.field2.f2:
      raise Exception('Cannot save models, because their values do not match!')

这里我们检查字段是否具有相同的值,如果没有,则抛出异常,阻止保存记录。

【讨论】:

    猜你喜欢
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多