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.
的好的解决方案
您定义一个基础对象,然后您可以从那里定义共享父对象属性的不同子对象
在你的情况下看起来像这样:
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.
然后您可以让您的 Restaurant
和 Hotel
模型继承自这个抽象 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
对象模型:
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.
您定义一个基础对象,然后您可以从那里定义共享父对象属性的不同子对象
在你的情况下看起来像这样:
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.
然后您可以让您的 Restaurant
和 Hotel
模型继承自这个抽象 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