Python django应用程序的数据库设计
我有一个问题让它变得更简单:我有一个像Python django应用程序的数据库设计,python,django,database,django-models,Python,Django,Database,Django Models,我有一个问题让它变得更简单:我有一个像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
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)
null=False,blank=False是默认值,应该删除
company\u name
和company\u number
相关,则应通过将其作为company
模型的外键来创建第二个标准格式餐厅
型号:
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)
class Room(models.Model):
rest_owner = models.ForeignKey(Restaurant,
on_delete=models.CASCADE,
related_name='rest_owner')
name = models.IntegerField()
Rooms = models.IntegerField()
rest\u owner
外键表示一个用户可以拥有多个餐厅
,并且
_delete=CASCADE上的表示,如果删除用户
或用户配置文件
,则
所有相关的餐厅
也应删除。你确定这就是你想要的吗
想要什么
related\u name
使您可以说my\u user.rest\u owner.all()
来获取用户拥有的所有餐厅,这并不完全是口头禅。最好使用您所在类名的复数形式,即related\u name=“restaurants”
将为您提供我的用户.restaurants.all()
CharField
,长度小于最大长度的TextFields
是没有意义的房间
型号:
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)
class Room(models.Model):
rest_owner = models.ForeignKey(Restaurant,
on_delete=models.CASCADE,
related_name='rest_owner')
name = models.IntegerField()
Rooms = models.IntegerField()
我不确定您想对名称
和房间
字段执行什么操作,因此我将跳过这些字段。对于餐厅的外键
:
我的房间。餐厅。城市
我的餐厅.rooms.all()
,它的阅读效果比我的餐厅.rest\u owner.all()
——很难猜到返回的房间
对于您需要考虑的图像:
不过,一个好的经验法则是——如果您有疑问,可以使用外键;-) 完美的解释。只有一个问题,如果我想对每个房间有多个图像,我想应该使用多个图像字段?是的,如果同一组图像应该用于多个房间,那么使用多个图像字段是明智的。
class Room(models.Model):
restaurant = models.ForeignKey(Restaurant, related_name='rooms', ...)