这是一个在巴西使用的数据库,所以语言是葡萄牙语。翻译:
我使用这个数据库来跟踪停车场中的车辆,每月记录车辆。
我的问题是排列之一:每个人可以有很多辆车,但每辆车只属于一个人。
我正在使用 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
如果出于某种原因(清晰度、清洁度或其他原因)您希望proprietario
在Mensalista
模型上拥有一个属性,您可以简单地添加以下内容:
@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
为了进一步澄清,您拥有的模型称为非规范化(您可以在此处阅读有关规范化和非规范化的更多信息。本质上,您的模型是多余的,因为您在两者上都有一个ForeignKey
to ,但您希望其中的人是一样的人,你可以通过擦除参考,以节省自己的一些麻烦在您的模型,这样就不需要执行这两个参考一致,因为只有一个参考。Person
Vehicle
Monthly
Monthly
Vehicle
Person
Monthly
Person
Person
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句