外键-获取值

时间:2019-04-08 22:19:15

标签: django django-forms django-orm

我创建了以下模型。许多帐户属于一台计算机。

class Computer(models.Model):
    name = models.CharField(max_length=256)
    def __str__(self):
        return str(self.name)



class Accounts(models.Model):
    computer = models.ForeignKey(Computer, on_delete=models.CASCADE, related_name='related_name_accounts')
    username = models.CharField(max_length=10)
    def __str__(self):
        return str(self.username)

我现在要创建一个表单,在其中我可以从属于计算机的所有用户的下拉列表中选择一个用户

class ComputerForm(forms.ModelForm):
    class Meta:
        model = Computer
        exclude = ['name',]

    def __init__(self, *args, **kwargs):
        super(ComputerForm, self).__init__(*args, **kwargs)
        self.fields['user']=forms.ModelChoiceField(queryset=Computer.related_name_accounts.all())

但是我得到一个错误

  

'ReverseManyToOneDescriptor'对象没有属性'all'

如何调整__init__中的查询集以显示计算机的所有用户?

编辑:

>>> x = Computer.objects.filter(pk=3).get()
>>> x.related_name_accounts.all()

我将需要以某种方式将动态pk传递给ModelForm吗?

2 个答案:

答案 0 :(得分:0)

您的问题是您在C中使用了大写字母Computer.related_name_accounts.all()。这没有道理,因为Computer模型没有相关字段-它是 instances

这行代码将起作用:

computer = Computer.objects.get(id=1)
computer.related_name_accounts.all()

但是问题是,我不确定您所说的...of all users that belong to a Computer是什么意思,因为您在ForeignKey和{{之间没有OneToOneUser关系1}}。

答案 1 :(得分:0)

您可以将模型的实例传递给这样的表单:

x = Computer.objects.get(pk=3)
form = ComputerForm(instace=x)

并通过self.instance形式的方法来访问它:

class ComputerForm(forms.ModelForm):
    class Meta:
        model = Computer
        exclude = ['name',]

    def __init__(self, *args, **kwargs):
        super(ComputerForm, self).__init__(*args, **kwargs)
        self.fields['user']=forms.ModelChoiceField(
            queryset=self.instance.related_name_accounts.all()
        )