簡體   English   中英

Django:相同的 model 具有不同的功能?

[英]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 的字段中。

然后,您可以讓您的RestaurantHotel模型繼承此抽象 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的庫。

我將一一解釋:

圖式

  • category表包含所有類別。
  • 現在每個類別可能都有一些共同和獨特的功能。 features將與category表有many to many關系。
    所以我們創建feature_master表,我們將 map 它與類別表。
  • feature_master表包含所有功能。
  • category_feature_map表是 map 表(連接表)
  • object表包含有關 object 的所有詳細信息,而object_detail表將包含特定 object 的所有feature

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM