在Django模型中实现这些关系的正确做法

时间:2019-01-25 08:44:29

标签: python django database-design

我正在设计数据库,想知道我实现的关系是否是最佳实践。

目标是一个人可以拥有多个位置,甚至多个人甚至可以在不同时间预订一个位置。一个地方可以进行多次预订。

所以我正在使用以下代码:

class User(models.Model):
    name = models.CharField(max_length=100)
    ban = models.BooleanField(default=False)

class Place(models.Model):
    name = models.CharField(max_length=50)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, )

class Bookings(models.Model):
    date = models.CharField(max_length=100)
    booker = models.ForeignKey(User, on_delete=models.CASCADE)
    place = models.ForeignKey(Place, on_delete=models.CASCADE)

预期输出是实现关系的安全方法。目前,当我在外壳中测试它们时,它们正在工作,具有一个或两个位置/用户,但是我不确定这是否是最佳方法。

2 个答案:

答案 0 :(得分:1)

使用n-to-n relationship是实现它的好方法。

  

注意:您应该考虑用DateField代替date = models.CharField(max_length=100)

     

如果您想确保数据安全,可以将on_delete=models.CASCADE换成更安全的模式,例如on_delete=models.PROTECT

答案 1 :(得分:1)

您的关系是正确的,但是当前的Booking模型允许同时预订同一地点的多个地点。您至少需要对(place, date)施加唯一约束。另外,正如olinox所提到的,您肯定想要DateField的{​​{1}}(或DatetimeField):

Booking.date

此外,请使用contrib.auth class Booking(models.Model): date = models.DateField() booker = models.ForeignKey(User, on_delete=models.CASCADE) place = models.ForeignKey(Place, on_delete=models.CASCADE) class Meta: unique_together = [("date", "place")] 模型或兼容的User-安全身份验证并不是那么简单,因此最好使用经过测试,证明,维护的代码。