我正在设计数据库,想知道我实现的关系是否是最佳实践。
目标是一个人可以拥有多个位置,甚至多个人甚至可以在不同时间预订一个位置。一个地方可以进行多次预订。
所以我正在使用以下代码:
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)
预期输出是实现关系的安全方法。目前,当我在外壳中测试它们时,它们正在工作,具有一个或两个位置/用户,但是我不确定这是否是最佳方法。
答案 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
-安全身份验证并不是那么简单,因此最好使用经过测试,证明,维护的代码。