У меня есть модель, которая выглядит так:

class Mentorship (models.Model):
    mentor = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='mentor_user_id')
    mentee = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='mentee_user_id')

    objects = MentorshipManager()

    def clean(self):
        print(self.mentor_id)  # is set and printed to stdout
        print(self.mentee_id)  # is set and printed to stdout

        if Mentorship.objects.is_mentor(self.mentor_id, self.mentee_id):
            raise ValidationError(_('This user is already a mentor.'))

У менеджера есть функция проверки того, является ли кто-то уже наставником другого пользователя, которая вызывается при clean() экземпляре:

def is_mentor_for_goal(self, mentor_id, mentee_id, personal_goal_id):
    if self.exists(mentor_id=mentor_id, mentee_id=mentee_id):
        return True
    else:
        return False

Однако я всегда получаю исключение при доступе к атрибуту mentor_id или mentee_id в файле exists:

Django Version:     1.6.1
Exception Type:     TypeError
Exception Value:    exists() got an unexpected keyword argument 'mentor_id'

Есть ли причина, по которой я не могу получить доступ к полю _id в диспетчере? Я просто не понимаю, почему поле доступно в (несохраненном) экземпляре, но не в диспетчере.

0
Chris 6 Мар 2014 в 16:05
Попробуйте это: mentor__id=mentor_id .
 – 
Priyank Patel
6 Мар 2014 в 16:11

2 ответа

Лучший ответ

Некоторые вещи mentor__id будут работать только в методах набора запросов, но не такие вещи, как print. Вы также должны использовать pk вместо id, вот как это будет работать:

class Mentorship(models.Model):
    mentor = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='mentor_user_id')
    mentee = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='mentee_user_id')

    objects = MentorshipManager()

    def clean(self):
        print(self.mentor.pk)  # is set and printed to stdout
        print(self.mentee.pk)  # is set and printed to stdout

        if Mentorship.objects.filter(mentor=self.mentor).exists():
            raise ValidationError(_('This user is already a mentor.'))

def is_mentor_for_goal(self, mentor_id, mentee_id, personal_goal_id):
    return self.exists(mentor__pk=mentor_id, mentee__pk=mentee_id)
0
Burhan Khalid 6 Мар 2014 в 16:23

О ... мужик ... Это должно называться

if self.filter(mentor_id=mentor_id, mentee_id=mentee_id).exists()

Спасибо за ваши комментарии

2
Chris 6 Мар 2014 в 16:20