0

私のモデルでは:

class StudentProfile(models.Model):
    # Relational fields
    #more fields
    sports_assigned = models.ManyToManyField('Sport', through="StudentSportAssociation")

そして私のモデルフォームは次のようになります:

class UpdateStudentForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(UpdateStudentForm, self).__init__(*args, **kwargs)
    class Meta:
        model = StudentProfile
    sports_assigned = forms.ModelMultipleChoiceField(queryset=SportWithLevel.objects.all(),
                                                     widget=FilteredSelectMultiple("Select", is_stacked=False), required=True)

スルーテーブルは次のとおりです。

class StudentSportAssociation(AbstractBaseModel):
    """
    Association of student to a sport and his current level in the sport
    """
    sport = models.ForeignKey('Sport')
    level = models.ForeignKey('Level')
    student = models.ForeignKey('StudentProfile', related_name="sports_with_levels")
    # save and all follows

今、私はアクセスする必要があります

StudentSportAssociation

フォームにアクセスしている間、テーブルを「通過」します。現在、Sportモデルから値をフェッチしています。この通常の方法を破り、スルーテーブルから詳細を取得するために何かできることはありますか?

4

1 に答える 1

0

django ドキュメントのこのセクションをご覧ください: https://docs.djangoproject.com/en/1.4/topics/db/models/#extra-fields-on-many-to-many-relationships。特に最後の 2 つの例を読んでください。中間オブジェクトを取得する方法について説明します。

要約すると、次の 2 つの選択肢があります。

1.別のクエリで中間モデルを取得する

StudentSportAssociation.objects.filter(student=student_profile_instance)

2.多対多の逆関係を照会します。あなたの場合:

student_profile_instance.sports_with_levels.all()

"sports_with_levels" related_name を定義したため、定義しない場合は次のようになります。

student_profile_instance.studentsportassociation_set.all()

Django は、デフォルトでモデル名に「_set」を追加します。

于 2013-02-07T10:16:13.950 に答える