Скажем, у меня есть сайт, который включает команды и членов. У меня есть модель команды и модель члена:Каков правильный способ структурирования членства в Django?
class Team(models.Model):
name = CharField()
class Member(models.Model):
name = models.CharField()
team = models.ManyToManyField(Team)
В этой связи, Team
и Member
непосредственно связаны с использованием ManyToManyField
(члены могут иметь более одной команды).
Это означало бы, что я добавлять и удалять пользователей из команд в представлении следующим образом:
team.objects.add(member) # Add a member to a team
team.objects.remove(member) # remove a member from a team
Альтернатива заключается в удалении ManyToMany
отношения и сделать модель «членство» между командами и членов, как и :
class Membership(models.Model):
is_active = BooleanField(default=True)
team = models.ForeignKey(Team)
member = models.ForeignKey(Member)
Таким образом, связать член команды я бы get_or_create
Membership
экземпляра. Чтобы удалить или повторно добавить участника в команду, я бы переключил флаг is_active
, а не add()
или remove()
ManyToMany
.
Это более подвержено ошибкам add()
и remove()
членов из команды, используя прямую связь, или лучше использовать get_or_create
на промежуточной Membership
модели?
Или, является ли он правильным и точным в использовании?
Я не совсем уверен, что вы спрашиваете здесь: «это более подверженный ошибкам», кажется, является довольно субъективным вопросом. Обратите внимание, что вы можете комбинировать подходы, установив членство как параметр 'through' для ManyToManyField. –
@ DanielRoseman Я слышал, что использование 'add()' и 'remove()' может быть более подверженным ошибкам на уровне базы данных, а не просто переворачивать флаг на промежуточной модели? Может быть, это не так? – YPCrumble