这是一个在巴西使用的数据库,所以语言是葡萄牙语。翻译:
我使用该数据库来跟踪具有每月车辆记录的停车场中的车辆。
我的问题是一种排列方式:每个人可能有很多车辆,但是每辆车只属于一个人。
我正在使用Django的SqlLite 3
数据库中的外键
Models.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)
答案 0 :(得分:1)
我建议您对这种情况进行建模有点不同。由于您的模型Vehicle
已与模型Person
相关,因此模型Mensalista
中的属性属性不是必需的,这听起来足以解决您的问题。
请注意,一旦您获得Person's
属性,因为它与您的模型Vehicle
有关系,就我而言,在我看来,{{1 }}到Person
,如果您已经通过模型Mensalita
隐含它们之间的关系:
Vehicle
但是,在两个人共享同一辆车并且此车最终被其中一些驾驶员停放的情况下,此属性将很有帮助,但并不是解决您问题的最佳解决方案。
希望我能正确理解您的问题。请让我知道是否一切都足够清楚。如果我错过了什么,我将很乐意为您提供帮助。
答案 1 :(得分:0)
您不需要将“人员”(Pessoa)存储在“月度(Mensalista)”模型中,因为车辆已经定义了该模型。拥有Mensalista
的实例(例如m
),您只需执行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
为了更清楚一点,您拥有的模型称为非规范化模型(您可以阅读有关规范化和非规范化here的更多信息。本质上,模型是多余的,因为您有ForeignKey
Person
和Vehicle
上的Monthly
,但您希望Monthly
中的人与Vehicle
中的人相同。删除Person
模型中对Monthly
的引用,这样就无需强制对Person
的引用都是一致的,因为对Person
的引用只有一个