数据库中的外键

毛里西奥·卡尔菲尔兹

这是一个在巴西使用的数据库,所以语言是葡萄牙语。翻译:

  • 人 = 人
  • 车辆 = 车辆

我使用这个数据库来跟踪停车场中的车辆,每月记录车辆。

我的问题是排列之一:每个人可以有很多辆车,但每辆车只属于一个人。

我如何确保在进行条目时,车辆仅以个人 (Pessoa) 的名义注册,而不是以车辆 (Veiculo) 的名义注册?

我正在使用 Django 的 SqlLite 3

数据库中的外键

模型.py

class Pessoa(models.Model):
    nome = models.CharField(max_length=50, blank=False)
    email = models.EmailField(blank=False)
    cpf = models.CharField(max_length=11, unique=True, blank=False)
    endereco = models.CharField(max_length=50)
    numero = models.CharField(max_length=10)
    bairro = models.CharField(max_length=30)
    telefone = models.CharField(max_length=20, blank=False)
    cidade = models.CharField(max_length=20)
    estado = models.CharField(max_length=2, choices=STATE_CHOICES)

class Veiculo(models.Model):
    marca = models.ForeignKey(Marca, on_delete=models.CASCADE, blank=False)
    modelo = models.CharField(max_length=20, blank=False)
    ano = models.CharField(max_length=7)
    placa = models.CharField(max_length=7)
    proprietario = models.ForeignKey(
        Pessoa, on_delete=models.CASCADE, blank=False, )
    cor = models.CharField(max_length=15, blank=False)
    observacoes = models.TextField(blank=False)

class Mensalista(models.Model):
    veiculo = models.ForeignKey(Veiculo, on_delete=models.CASCADE, 
         blank=False)
    inicio = models.DateField(blank=False)
    validade = models.DateField(blank=False)
    proprietario = models.ForeignKey(
        Pessoa, blank=False, on_delete=models.CASCADE)
    valor_mes = models.DecimalField(
        max_digits=6, decimal_places=2, blank=False)
    pago = models.CharField(max_length=15, choices=PAGO_CHOICES)
伊维萨尼

您不需要将 Person (Pessoa) 存储在 Monthly (Mensalista) 模型中,因为它已由车辆定义。拥有Mensalista(假设m的实例,您只需执行以下操作即可访问 Vehicles 的所有者m.veiculo.proprietario

如果出于某种原因(清晰度、清洁度或其他原因)您希望proprietarioMensalista模型拥有一个属性,您可以简单地添加以下内容:

@property
def proprietario(self):
    return self.veiculo.proprietario

总而言之,您可以将Mensalista模型更改为以下内容:

class Mensalista(models.Model):
    veiculo = models.ForeignKey(Veiculo, on_delete=models.CASCADE, blank=False)
    inicio = models.DateField(blank=False)
    validade = models.DateField(blank=False)
    # The next is not necessary
    # proprietario = models.ForeignKey(Pessoa, blank=False, on_delete=models.CASCADE)
    valor_mes = models.DecimalField(max_digits=6, decimal_places=2, blank=False)
    pago = models.CharField(max_length=15, choices=PAGO_CHOICES)

    @property
    def proprietario(self):
        return self.veiculo.proprietario

为了进一步澄清,您拥有的模型称为非规范化(您可以在此处阅读有关规范化和非规范化的更多信息。本质上,您的模型是多余的,因为您在两者上都有一个ForeignKeyto 但您希望其中的人是一样的人,你可以通过擦除参考,以节省自己的一些麻烦在您的模型,这样就不需要执行这两个参考一致,因为只有一个参考PersonVehicleMonthlyMonthlyVehiclePersonMonthlyPersonPerson

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章