2015-02-23 3 views
1

Скажем, у меня есть сайт, который включает команды и членов. У меня есть модель команды и модель члена:Каков правильный способ структурирования членства в 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_createMembership экземпляра. Чтобы удалить или повторно добавить участника в команду, я бы переключил флаг is_active, а не add() или remove()ManyToMany.

Это более подвержено ошибкам add() и remove() членов из команды, используя прямую связь, или лучше использовать get_or_create на промежуточной Membership модели?

Или, является ли он правильным и точным в использовании?

+0

Я не совсем уверен, что вы спрашиваете здесь: «это более подверженный ошибкам», кажется, является довольно субъективным вопросом. Обратите внимание, что вы можете комбинировать подходы, установив членство как параметр 'through' для ManyToManyField. –

+0

@ DanielRoseman Я слышал, что использование 'add()' и 'remove()' может быть более подверженным ошибкам на уровне базы данных, а не просто переворачивать флаг на промежуточной модели? Может быть, это не так? – YPCrumble

ответ

2

Я думаю, что вам действительно нужно решить -> вам нужен extra data on your M2M relationship? Потому что ваша промежуточная модель именно так. И я не могу найти его как менее подверженную ошибкам, основное отличие от флага is_active в том, что это дает вам что-то вроде исторической информации о прошлых членствах. Вам нужны эти данные? Если вы это сделаете - подойдите к этому подходу. Если вы просто делаете это, потому что считаете, что он менее подвержен ошибкам, то для меня вы решаете неправильную проблему.

+0

«решение неправильной проблемы»; что является реальной проблемой подхода OP. –

Смежные вопросы