Django обратная фильтрация внешнего ключа - PullRequest
1 голос
/ 12 января 2020

Я все еще относительно новичок в Django и все еще немного борюсь с фильтрацией ForeignKey, и я был бы признателен за любую помощь в решении моей проблемы. У меня есть 2 модели ниже, и в моей PositionUpdateForm мне нужно, чтобы в поле «кандидат» были только кандидаты на эту должность.

class Position(models.Model):
    title = models.CharField(max_length=128)
    candidate = models.ForeignKey('careers.Applicant',
        on_delete=models.SET_NULL,
        related_name='candidates',
        blank=True,
        null=True
    )

class Applicant(models.Model):
    first_name = models.CharField(max_length=128)
        blank=False,
    )
    position = models.ManyToManyField(Position,
        related_name='applicants',
        blank=True
    )

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

class PositionUpdateForm(forms.ModelForm):
    candidate = forms.ModelChoiceField(queryset=Applicant.objects.filter(???))

def __init__(self, *args, **kwargs):
    super(PositionUpdateForm, self).__init__(*args, **kwargs)
    self.fields['candidate'].queryset = Applicant.objects.filter(???)

Спасибо за любую помощь.

1 Ответ

1 голос
/ 12 января 2020

Если вы хотите, чтобы Applicant s имели position к этому Position, вы можете получить это с помощью:

class PositionUpdateForm(forms.ModelForm):
    candidate = forms.ModelChoiceField(queryset=<b>Applicant.objects.empty()</b>)

    def __init__(self, *args, **kwargs):
        super(PositionUpdateForm, self).__init__(*args, **kwargs)
        self.fields['candidate'].queryset = <b>Applicant.objects.filter(position=self.instance)</b>

или мы можем использовать соотношение наоборот:

class PositionUpdateForm(forms.ModelForm):
    candidate = forms.ModelChoiceField(queryset=<b>Applicant.objects.empty()</b>)

    def __init__(self, *args, **kwargs):
        super(PositionUpdateForm, self).__init__(*args, **kwargs)
        self.fields['candidate'].queryset = self.instance.<b>applicants.all()</b>

Обратите внимание, что вы можете использовать это только при обновлении Position модели, так как в противном случае нет связанных Applicant записей курса.

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