gpt4 book ai didi

python - django 应用程序的数据库设计

转载 作者:行者123 更新时间:2023-12-04 10:53:13 26 4
gpt4 key购买 nike

我有一个问题要让它更容易:我有一个像 user -> Hotel - > Rooms 这样的关系.用户可以创建酒店,然后每个酒店可以有很多房间。

现在我有一个像

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
company_name=models.CharField(max_length=50, null=False, blank=False)
email=models.CharField(max_length=50, null=False, blank=False)
company_number=models.CharField(max_length=50, null=False, blank=False)

并创建餐厅
class Restaurant(models.Model):
rest_owner = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='rest_owner')
name = models.CharField(max_length=50, null=False, blank=False)
address = models.TextField(max_length=100, null=False)
city = models.CharField(null=True, max_length=50)
country = models.CharField(null=True, max_length=30)

现在房间
class Room(models.Model):
rest_owner = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name='rest_owner')
name = models.IntegerField()
Rooms = models.IntegerField()

这是做到这一点的好方法吗?并保存房间和餐厅的图像 我应该制作一个
class Image(models.Model):
image = models.ImageField(null=False, upload_to='Gallery')

然后在房间和餐厅使用,如 images = models.ManyToManyField(Image) ? .我需要知道做这两个的最佳方法。谢谢

最佳答案

你的大部分设计都很好,但是,有一些小问题:

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
company_name=models.CharField(max_length=50, null=False, blank=False)
email=models.CharField(max_length=50, null=False, blank=False)
company_number=models.CharField(max_length=50, null=False, blank=False)
  • User 模型已经有一个 email 字段,所以这里不需要一个。
  • null=False, blank=False是默认值,应该删除。
  • 如果 company_namecompany_number是相关的,那么你应该通过使它们成为 Company 的外键来制作这个第二范式。型号
  •     class Company(models.Model):
    name = models.CharField(max_length=50)
    number = models.CharField(max_length=50)

    class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company = models.ForeignKey(Company)

    对于 Restaurant模型:
    class Restaurant(models.Model):
    rest_owner = models.ForeignKey(UserProfile,
    on_delete=models.CASCADE,
    related_name='rest_owner')
    name = models.CharField(max_length=50)
    address = models.TextField(max_length=100)
    city = models.CharField(null=True, max_length=50)
    country = models.CharField(null=True, max_length=30)
  • rest_owner外键表示一个用户可以拥有多个 Restaurants , 和on_delete=CASCADE说如果你删除一个 UserUserProfile ,那么
    所有关联 Restaurants也应该删除。你确定这是你的吗
    想?
  • related_name这样你就可以说 my_user.rest_owner.all()获取用户拥有的所有餐厅,这并不完全是流言蜚语。最好使用您所在的类名的复数形式,即 related_name="restaurants"会给你my_user.restaurants.all() .
  • 没有 TextFields 没有意义长度小于 CharField 的最大长度.
  • 我会让国家成为一个两个字符的字段,并用国家的 ISO 3166-1 alpha-2 代码填充它。

  • 对于 Room模型:
    class Room(models.Model):
    rest_owner = models.ForeignKey(Restaurant,
    on_delete=models.CASCADE,
    related_name='rest_owner')
    name = models.IntegerField()
    Rooms = models.IntegerField()

    我不确定你想用 name 做什么和 Rooms字段,所以我会跳过这些。对于 Restaurant 的外键:
  • 用它指向的模型的名称命名外键字段是一个很好的做法,即
  •     class Room(models.Model):
    restaurant = models.ForeignKey(Restaurant, ...)

    允许你说例如: my_room.restaurant.city .
  • 与上面类似,相关名称应该是您所在模型的复数形式,因此
  •     class Room(models.Model):
    restaurant = models.ForeignKey(Restaurant, related_name='rooms', ...)

    这给你 my_restaurant.rooms.all() ,这比 my_restaurant.rest_owner.all() 读起来要好得多——这很难猜到返回的房间……

    对于您需要考虑的图像:
  • 可以在房间之间共享图像吗(是 => 多对多,否 => 外键)
  • 如果图像被编辑,所有使用图像的房间都应该立即获得更改(是 => ManyToMany,否 => ForeignKey)。

  • 不过,一个很好的经验法则是 - 如果您有疑问,可以使用外键 ;-)

    关于python - django 应用程序的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59365017/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com