2015-07-15 2 views
0

Мне нужно отслеживать приглашение от пользователей к пользователю. Кто пользователи приглашают кого. Итак, у меня есть модель User, у которой M2M есть «я».django many to many duplicate relation issue

class User(AbstractBaseUser, PermissionsMixin): 

… 

# referral part 
invited_by = models.ForeignKey("self", blank=True, null=True, db_index=True) 
recruits = models.ManyToManyField("self", blank=True, null=True) 
direct_matches = models.ManyToManyField("self", blank=True, null=True) 
second_matches = models.ManyToManyField("self", blank=True, null=True) 
third_matches = models.ManyToManyField("self", blank=True, null=True) 

и эта часть кода, которые отслеживают направление:

@login_required 
def do_ref_system_stuff(request): 
    """ 
     Assign recruits on 'invited_by' user and invited_by to user. 
    """ 

    if 'invited_by' in request.session: 

     # Add user to recruits 
     invited_by = get_object_or_404(User, pk=request.session['invited_by']) 
     invited_by.recruits.add(request.user) 
     invited_by.save() 

     # Assign invited_by to the new user 
     request.user.invited_by = invited_by 
     request.user.save() 

     del request.session['invited_by'] 
    return HttpResponseRedirect('/dashboard/') 

Сейчас:

invited_by.recruits.all() 
[<User: prova>] # new registered user == 'request.user' 

Но почему, если я:

request.user.recruits.all() 
[<User: dioc>] # invited_by 

Почему отношения является дубликатом ?

Благодаря

+0

Вопрос: почему у вас как invited_by и рекрутов в вашей модели? Также invite_by много-к-одному, а новобранцы - многие-ко-многим? кажется самодостаточным –

ответ

0

Почему как invited_by и recruits? Не могли бы вы просто сделать:

class User(AbstractBaseUser, PermissionsMixin): 
    ... 
    invited_by = models.ForeignKey("self", blank=True, null=True, db_index=True, related_name='recruits') 

Это позволит вам получить рекрутов пользователя просто делать:

user.recruits.all() 
+0

awesome и отслеживать реферал второго/третьего/четырех уровня? – beddamadre