首页 > 解决方案 > 在 django 模型中实现这些关系的正确做法

问题描述

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

目的是一个人可以拥有多个地方,多个人甚至可以在不同时间预订一个地方。一个地方可以有多个预订。

所以我正在使用这段代码:

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)

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

标签: pythondjangodatabase-design

解决方案


您的关系是正确的,但当前Booking模型允许同时对同一个地方进行多次预订。您至少需要对(place, date). 同样正如 olinox 提到的,你肯定想要一个DateField(或DatetimeFieldBooking.date

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")]

此外,使用 contrib.authUser模型或兼容的AbstractUser- 安全身份验证并不是那么简单,因此最好使用经过测试、证明、维护的代码。


推荐阅读