Сохранение двух или нескольких записей одновременно с отношением внешнего ключа в Django Admin - PullRequest
0 голосов
/ 07 мая 2018

Я создаю приложение, управляющее процессом собеседования. В одном интервью кандидат может быть опрошен одним или несколькими интервьюерами, а интервьюер может взять интервью у одного или нескольких кандидатов. Это похоже на интервью «круглого стола». Упрощенная версия моделей:

class Interviewer(models.Model):
    interviewer_id = models.AutoField(primary_key=True)
    first_name = models.CharField(max_length=200, blank=False, null=False)
    last_name = models.CharField(max_length=200, blank=False, null=False)
    candidates = models.ManyToManyField('Candidate', through='Interview')

class Candidate(models.Model):
    candidate_id = models.PositiveIntegerField(
        primary_key=True, blank=False, null=False)
    first_name = models.CharField(max_length=200, blank=False, null=False)
    last_name = models.CharField(max_length=200, blank=False, null=False

class Interview(models.Model):
    interview_name = models.CharField(max_length=200, blank=True, null=True)
    candidates = models.ForeignKey(
        Candidate, on_delete=models.CASCADE, blank=True, null=True, related_name='candidates')
    interviewers = models.ForeignKey(
        Interviewer, on_delete=models.CASCADE, blank=True, null=True, related_name='interviewers')

В админке Django для модели Интервью добавление записи для интервью означало бы, что мне нужно будет создать запись для каждого кандидата и интервьюера. Этот процесс обременителен, если есть много кандидатов и / или интервьюеров. Я хотел бы добавить всех кандидатов и интервьюеров для конкретного интервью. Я изменил свою модель, чтобы использовать форму ModelMultipleChoiceField вместо используемой по умолчанию SelectField для Django для внешних ключей.

class InterviewAdminForm(forms.ModelForm):
    interviewers = forms.ModelMultipleChoiceField(
        queryset=Interviewer.objects.all(),
        widget=FilteredSelectMultiple(
            verbose_name='interviewers', is_stacked=False
        )
    )

    candidates = forms.ModelMultipleChoiceField(
        queryset=Candidate.objects.all(),
        widget=FilteredSelectMultiple(
            verbose_name='candidates', is_stacked=False
        )
    )

    class Meta:
        model = Interview
        fields = '__all__'    

@admin.register(Interview)
class InterviewAdmin(admin.ModelAdmin):
    form = InterviewAdminForm

Теперь отображается ModelMultipleChoiceField с виджетом FilteredSelectMultiple, который я могу использовать для выбора кандидатов и интервьюеров для конкретного интервью.

Проблема в том, что когда я нажимаю сохранить, отображается следующая ошибка

Cannot assign "<QuerySet [<Candidate: 11111111(John Doe)>, <Candidate: 22222222(Mary Moe)>]>": "Interview.candidates" must be a "Candidate" instance.

Я считаю, что он получает всех кандидатов, выбранных мной из ModelMultipleChoiceField в качестве набора запросов, и пытается добавить его в базу данных.

Как я могу поручить администратору Django добавить его как 2 отдельные записи?

Редактировать: Чтобы прояснить мой вопрос

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

...