Исключить экземпляр при обновлении рекурсивного внешнего ключа в Django - PullRequest
2 голосов
/ 02 мая 2019

У меня есть следующие модель и форма модели для Сотрудника:

models.py

class Employee(models.Model):
    reports_to = models.ForeignKey(
        'self', on_delete=models.SET_NULL,
        null=True, blank=True)

forms.py

class EmployeeForm(forms.ModelForm):
    class Meta:
        model = Employee

Идея состоит в том, что начальник сотрудника сам является сотрудником.

Проблема в том, что при обновлении экземпляра соответствующее поле формы представляет собой раскрывающийся список со всеми сотрудниками, включая сам объект, который я обновляю.

Есть ли простойспособ удаления самого экземпляра из выпадающих опций, чтобы ни один сотрудник не был его собственным боссом?

PS. Я не ищу решение, которое проверяет поле формы после отправки формы,а скорее удалив опцию из выпадающего списка формы вообще.Спасибо!

1 Ответ

2 голосов
/ 02 мая 2019

Да, вы можете изменить queryset соответствующего поля и опустить экземпляр, если этот экземпляр (уже) существует. Как:

class EmployeeForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        instance = self.instance
        if instance.pk is not None:
            self.fields['reports_to'].<b>queryset = Employee.objects.exclude(pk=instance.pk)</b>

    class Meta:
        model = Employee

В случае, если экземпляр имеет a pk, который не None (это означает, что вы редактируете экземпляр, а не создаете новый), тогда мы, таким образом, " patch "набор запросов, содержащий все Employee s, кроме этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...