如何在django模型表单中从直通模型中获取数据?

时间:2013-02-06 15:59:36

标签: django django-models django-forms

在我的模特中我有:

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模型中获取值。 可以做任何事情来打破这种正常的方式并从直通表中获取细节吗?

1 个答案:

答案 0 :(得分:0)

看一下django文档的这一部分: https://docs.djangoproject.com/en/1.4/topics/db/models/#extra-fields-on-many-to-many-relationships。 特别是阅读最后两个例子。他们描述了如何获得中间对象。

总结一下,你有两个选择:

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”。