Существует так много способов создания базы данных.
Пример:
class Tower(models.Model):
name = models.CharField(max_length=128)
class User(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField('UserTower')
class UserTower(models.Model):
user = models.ForeignKey('User', on_delete=models.CASCADE)
tower = models.ManyToManyField('Tower')
begin_date = models.DateTimeField()
end_date = models.DateTimeField()
В этом проекте вы можете добавить много экземпляров UserTower
для пользователя, и каждый экземпляр UserTower
может иметь много башен.
Теперь, если вы запрашиваете пользователей для пользователя:
User.objects.get(pk=1).members.all()
Вы будете иметь участников, сгруппированных по периодам времени, если вы сохранили их таким образом, но вам потребуется написать несколько кодов, чтобы избежать дубликатов для begin_date
, begin_date
и user
.
А теперь, если вам нужны башни:
user_members = User.objects.get(pk=1).members.all().values_list('tower', flat=True)
towers = Tower.objects.filter(pk__in=user_members).distinct()
Этот дизайн подходит, только если вы действительно не хотите дубликатов с одинаковыми begin_date
и begin_date
, для которых я не могу найти причину.
Вы можете по-прежнему иметь все функции, если добавляете несколько экземпляров с одинаковыми begin_date
, begin_date
и user
, но разными tower
.