这是一个数据库设计问题,而不是特定的Django问题。
我们有一个小型Django应用程序来管理年度会议。
会议的每一年都有一些共同的模型。例如,研讨会经常每年重复,我们经常使用相同的房间(研讨会或住宿室)。
对于这些模型,他们的一些领域每年都很常见,而其他领域会有所不同。
例如,每个AccomodationRoom
都有一个名称,一个建筑物和每年都很常见的功能。但是,实际的床位供应等其他因素每年都会有所不同。
需要每年保存历史数据,但我们也希望尽可能减少冗余重复,并且每年都需要重新输入(例如房间名称,网站名称和功能) 。同样适用于研讨会)
我最初的方法是创建一个存储公共数据的AccomodationRoom,然后提供存储瞬时年度信息的BedAvailability,并提供每年会议的链接。例如:
class AccommodationRoom(models.Model):
name = models.CharField(max_length=50)
site = models.ForeignKey(Site)
features = models.ManyToManyField(AccommodationFeature, null=True, blank=True)
class BedAvailability(models.Model):
number_of_single_beds = models.IntegerField()
number_of_double_beds = models.IntegerField()
conference = models.ForeignKey(Conference)
accommodation_room = models.ForeignKey(AccommodationRoom)
class Conference(models.Model):
year = models.CharField(max_length=4) # Example
然而,另一种方法是简单地取消这两个模型,并拥有一个包含所有内容的AccomodationRoom模型,将其直接链接到Conference模型,然后在AccomodationRoom.name和AccomodationRoom.Conference上强制执行唯一性。
class AccommodationRoom(models.Model):
name = models.CharField(max_length=50)
site = models.ForeignKey(Site)
features = models.ManyToManyField(AccommodationFeature, null=True, blank=True)
conference = models.ForeignKey(Conference)
number_of_single_beds = models.IntegerField()
number_of_double_beds = models.IntegerField()
class Meta:
ordering = ['conference', 'name']
unique_together = (("name", "conference"),)
或许有一种更好的方法可以做到这一点,我没有想到?在这里公开建议。
干杯, 维克多
答案 0 :(得分:1)
对您的第一个解决方案的一个小修改(我认为这是更好的解决方案,因为它比第二个解决方案更规范化)
class AccommodationRoom(models.Model):
name = models.CharField(max_length=50)
site = models.ForeignKey(Site)
features = models.ManyToManyField(AccommodationFeature, null=True, blank=True)
bed_availability = models.ForeignKey(BedAvailability)
class BedAvailability(models.Model):
number_of_single_beds = models.IntegerField()
number_of_double_beds = models.IntegerField()
class Conference(models.Model):
year = models.CharField(max_length=4) # Example
accommodation = models.ForeignKey(AccommodationRoom)
使用Django管理员后端,您可以首先使用床的规格创建BedAvailability对象。然后,您可以创建AccomodationRoom对象并将BedAvailability对象与其关联。然后,您最终可以创建一个Conference对象,并将AccommodationRoom对象与此关联。
如果您需要在同一个AccommodationRoom中使用一组新的BedAvailability一年,您可以使用新规范创建一个新的BedAvailability对象并将其与AccommodationRoom链接。即使BedAvailability规范发生变化,您也无需为下次会议重新输入AccommodationRoom数据。