Model.ManyToManyField.all()给出了AttributeError:'ManyToManyDescriptor'对象没有属性'all'

时间:2018-03-25 22:28:45

标签: python django attributeerror manytomanyfield django-2.0

我正在使用Django 2.0.2,Python 3.6.4和PyCharm 2017.3.3

模型:(在models.py中)

class Position(models.Model):
    title = models.CharField(max_length=50)
    gang = models.ForeignKey(Gang, on_delete=models.CASCADE)
    description = models.TextField(max_length=20000)

    def __str__(self):
        return str(self.title) + ', ' + str(self.gang)

class Application(models.Model):
    positions = models.ManyToManyField(Position)
    applicant = models.ForeignKey(User, on_delete=models.CASCADE)

class Ranking(models.Model):
    position = models.ForeignKey(Position, on_delete=models.CASCADE)
    applicant = models.ForeignKey(User, on_delete=models.CASCADE)
    rank = models.IntegerField(default=3,validators=[
            MaxValueValidator(3),
            MinValueValidator(1)
        ])

表格:(在forms.py中)

class RankingForm(forms.ModelForm):
    rank = forms.IntegerField(max_value=3, min_value=1)
    position = forms.ModelMultipleChoiceField(queryset=Application.positions.all())

    class Meta:
        model = Ranking
        exclude = ['applicant']
        fields = ('rank', 'position')

    def __init__(self, *args, **kwargs):
        super(RankingForm, self).__init__(*args, **kwargs)
        self.fields['rank'].widget.attrs.update({'class': 'form-control'})

我一直从

获取RankingForm中的AttributeError

“position = forms.ModelMultipleChoiceField(queryset = Application.positions.all())”

我写的时候

class Application(models.Model):
    ... 

    def __str__(self):
        return str(self.positions.all())

它在django-admin中显示为QuerySet(适用于forms.ModelMultipleChoiceField()),但写作

    class Application(models.Model):
    ... 

    def __str__(self):
        return str(Application.positions.all())

给了我同样的错误:'ManyToManyDescriptor'对象没有属性'all'

书写

    class RankingForm(forms.ModelForm):
        ...
        position = forms.ModelMultipleChoiceField(queryset=Position.objects.all())

有效,但这不是我想要显示的字段。

我想创建一个ModelMultipleChoiceField(),其中包含来自特定应用程序的所有位置,但是这个错误一直在阻碍。似乎只是引用一个模型不起作用,但引用自己做??任何帮助是极大的赞赏! :)

顺便说一下,我没有找到关于这个问题的任何好的文档,但this似乎是ManyToManyDescriptor所在的related_descriptors.py的代码

2 个答案:

答案 0 :(得分:1)

使用作为类的初始化实例的实例来评估关系。

应用程序的一个实例。

<form id="15" method="post" action="/open a new page" target="_blank">
<select name="docToSeize" style="width:150px" class="form1">
  <option value="11">RAP </option>
  <option value="12">CAD </option>
  <option value="18">GGO</option>
  <option value="1A">HYU</option>
</select>
</form>

初始化后更改表单查询集。

application = Application.objects.first()
application.positions.all()

答案 1 :(得分:0)

您可以使用ModelForm属性访问instance对象正在使用的模型的当前实例。然后,您可以使用它在__init__

中创建正确的查询集
class RankingForm(forms.ModelForm):
    ...

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['rank'].widget.attrs.update({'class': 'form-control'})
        self.fields['position'].queryset = self.instance.positions.all()