Внешний ключ - получить значения - PullRequest
0 голосов
/ 09 апреля 2019

Я создал следующие модели.Многие учетные записи принадлежат одному компьютеру.

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())
* 1006.* Но я получаю сообщение об ошибке

У объекта 'ReverseManyToOneDescriptor' нет атрибута 'all'

Как мне настроить набор запросов в __init__, чтобы отобразить всех пользователейкомпьютера?

Редактировать:

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

Мне как-то нужно передать динамический pk в ModelForm?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Вы можете передать экземпляр вашей модели в форму следующим образом:

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()
        )
0 голосов
/ 09 апреля 2019

Ваша проблема в том, что вы использовали капитал C в Computer.related_name_accounts.all().Это не имеет смысла, потому что модель Computer не имеет связанных полей - это экземпляры do.

Эта строка кода будет работать:

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

Но проблема в том, что я не уверен, что вы подразумеваете под ...of all users that belong to a Computer, поскольку у вас нет отношений ForeignKey или OneToOne между User и Computer.

...