0

次のようなモデルがあります。

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.'))

manager には、誰かがすでに別のユーザーのメンターであるかどうかを確認する関数があり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ただし、存在するormentee_id属性にアクセスしている間は常に例外が発生します。

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

manager 内の _id フィールドにアクセスできない理由はありますか? (保存されていない)インスタンスではフィールドにアクセスできるのに、マネージャーではアクセスできない理由がわかりません。

4

2 に答える 2

2

ああ...男...それは呼ばれるべきです

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

コメントしてくれてありがとう

于 2014-03-06T12:20:24.983 に答える
0

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)
于 2014-03-06T12:23:58.020 に答える