yes, yes, no and yes. Abstract models should inherit form models.Model. Abstract models should always have a Meta class with abstract=True. The order matters when it comes to shared functionality. Here's how I would code those models you had:
class Taggable(models.Model):
tag = models.CharField()
class Meta:
abstract = True
class Visible(models.Model):
visible = models.BooleanField()
class Meta:
abstract = True
class SomeFullModel(Taggable, Visible):
otherfield = models.CharField()
If you override a method on all three of those classes (e.g. the save method) and in each of them, call super(...).save(), then the order be:
SomeFullModel.save() => Taggable.save() => Visible.save() => models.Model.save()