1๐
A small modification to your first solution (I think it is better solution because it is more normalized than the second one)
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)
Using the Django admin backend, you can first create BedAvailability object with the specification of beds. Then you can create AccomodationRoom object and associate BedAvailability object with it. Then you can finally create a Conference object and associate AccommodationRoom object with this.
In case the you need a new set of BedAvailability for the same AccommodationRoom for another year, you can create a new BedAvailability object with new specifications and link it with AccommodationRoom. You would not need to re-enter AccommodationRoom data for the next conference even if the BedAvailability specifications change.