Django:具有不同功能的相同模型?

Django: Same model with different features?

对象模型:

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}"

类别模型:

class Category(models.Model):
    title = models.CharField(max_length=50)

    def __str__(self):
        return f"{self.title}"

例如,我有一些类别,如酒店、餐馆等。所以我希望每个类别都有不同的功能(添加新时的单选按钮),但我不确定如何正确处理它。酒店一定要有房间,泳池等,餐厅一定要有乡村厨房,座位等,以后我还会有其他品类。

问题是:这是最好的方法(实践)。

我的解决方案: 创建第三个 table 具有特征,每个类别都有列 features 并用逗号分隔存储特征,但这不是很好基于 DB normalization.

的好的解决方案

您可以使用multi-table inheritance

您定义一个基础对象,然后您可以从那里定义共享父对象属性的不同子对象

在你的情况下看起来像这样:

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 的库。

您可以使用 abstract base classes:

Abstract base classes are useful when you want to put some common information into a number of other models. You write your base class and put abstract=True in the Meta class. This model will then not be used to create any database table. Instead, when it is used as a base class for other models, its fields will be added to those of the child class.

然后您可以让您的 RestaurantHotel 模型继承自这个抽象 class。然后,Django 将创建两个表,其中包含抽象 class 中的基本字段以及每个模型中的特定字段。

i will explain this one by one :

  • category table 包含所有类别。
  • 现在每个类别可能都有一些共同和独特的特征。features 将与 category table 有 many to many 关系。
    所以我们创建 feature_master table 并将其映射到类别 table.
  • feature_master table 包含所有功能。
  • category_feature_map table 是地图 table(junction table)
  • object table 包含有关对象的所有详细信息,object_detail table 将包含特定对象的所有 feature