[英]Database design for django application
我有一個問題讓它更容易:我有一個像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_name
和company_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
表示如果您刪除一個User
或UserProfile
,那么所有關聯的Restaurants
也應該被刪除。 你確定這是你想要的嗎?related_name
使得它,所以你可以說my_user.rest_owner.all()
來獲取所有用戶,這不正是流動舌擁有的餐館。 最好使用您所在的類名的復數形式,即my_user.restaurants.all()
related_name="restaurants"
將為您提供my_user.restaurants.all()
。TextFields
的長度小於CharField
的最大長度是沒有意義的。 對於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()
讀起來要好得多——這很難猜到返回的房間......
對於您需要考慮的圖像:
不過,一個很好的經驗法則是 - 如果您有疑問,可以使用外鍵 ;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.