[英]Django: Same model with different features?
Object Model:
class Object(models.Model):
author = models.ForeignKey(ProfileUser, on_delete=models.CASCADE)
title = models.CharField(max_length=300)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
address = models.CharField(max_length=300)
content = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
approved_object = models.BooleanField(default=False)
admin_seen = models.BooleanField(default=False)
def __str__(self):
return f"{self.title}"
類別 model:
class Category(models.Model):
title = models.CharField(max_length=50)
def __str__(self):
return f"{self.title}"
例如,我有一些類別,如酒店、餐館等。所以我希望每個類別都有不同的功能(添加新的單選按鈕),但我不確定如何正確處理它。 酒店必須有房間,游泳池等。餐館必須有鄉村廚房,座位等。將來我會有其他類別。
問題是:這是最好的方法(實踐)。
我的解決方案:創建具有特征的第三個表,並且每個類別都有列features
並用逗號分隔存儲特征,但這不是基於DB normalization的很好的解決方案。
您可以使用抽象基類:
當您想將一些公共信息放入許多其他模型中時,抽象基類很有用。 您編寫基礎 class 並將 abstract=True 放入 Meta class 中。 然后,此 model 將不會用於創建任何數據庫表。 相反,當它用作其他模型的基礎 class 時,其字段將添加到子 class 的字段中。
然后,您可以讓您的Restaurant
和Hotel
模型繼承此抽象 class。 然后 Django 將創建兩個表,其中包含來自抽象 class 的基本字段以及來自每個模型的特定字段。
可以使用多表 inheritance
您定義一個基礎 object,然后您可以從那里定義共享父屬性的不同子對象
在你的情況下,看起來像這樣:
class Object(models.Model):
...
class Restaurant(Object):
seats = IntegerField(...)
reservations = ManyToManyField(...)
class Hotel(Object):
rooms = IntegerField(...)
has_pool = BooleanField(...)
Django 將自動為您創建關系並管理查詢。 要獲取所有餐廳,您可以使用Restaurant.objects.all()
,但有一個限制。 查詢Object.objects.all()
時,您將獲得Objects
的列表,而不是它們的特定子類。 如果我沒記錯的話,您可以通過(例如) object.restaurant
訪問特定實例。
如果您確實想獲取特定對象,可以查看一個名為Django-polymorphic的庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.