Django Наследование модели: дочерний класс модели создает дополнительные строки в таблице данных родительского класса модели. - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь применить базовое c наследование модели на основе Django документации. Конечная цель - получить доступ к общему идентификатору моделей Exam и Date в представлении get_date_info, которое вызывается после представления get_exam_info. Возможно, есть лучший способ сделать это, чем наследование модели, но мне это показалось наиболее простым.

Вот соответствующий код модели:

class Exam(models.Model):
    instructor_first_name = models.CharField(max_length=30)
    instructor_last_name = models.CharField(max_length=30)
    department = models.CharField(max_length=30, null=True)
    course_name = models.CharField(max_length=30, null=True)
    course_number = models.IntegerField(null=True)
    section_number = models.IntegerField(null=True)
    num_students = models.IntegerField(null=True)
    calculator = models.CharField(max_length=30, blank=True)
    notes = models.CharField(max_length=30, blank=True)
    computer_exam = models.BooleanField(default=False)
    scantron = models.BooleanField(default=False)
    timed = models.BooleanField(default=False)
    dictionary = models.BooleanField(default=False)
    comment = models.CharField(max_length=300, blank=True)

class Date(Exam):
    start_date = models.DateField()
    end_date = models.DateField()
    late_start_date = models.DateField(blank=True, null=True)
    late_end_date = models.DateField(blank=True, null=True)

Вот соответствующий код представления:

def get_exam_info(request):
    if request.method == 'POST':
        exam_form = ExamForm(request.POST)
        if exam_form.is_valid():
            exam_form.save()

            date_form = DateForm()
            return render(request, 'date_info.html', {'date_form': date_form})
    else:
        exam_form = ExamForm()

    return render(request, 'exam_info.html', {'exam_form': exam_form})

def get_date_info(request):
    exam_request = Exam.objects.all()

    if request.method == 'POST':
        date_instance = Date()
        date_form = DateForm(request.POST, instance=date_instance)
        if date_form.is_valid():
            date_form.save()

            current_user_id = date_instance.exam_ptr_id
            print(current_user_id)

            return HttpResponseRedirect('/')

    else:
        date_form = DateForm()

    return render(request, 'date_info.html', {'date_form': date_form})

Вот результат в базе данных: Это это таблица экзамена

И это таблица дат

Некоторые другие вещи, которые я пробовал: я создал абстрактную модель, которая содержит общий идентификатор, затем я сделал классы Exam и Date подклассами этого абстрактного суперкласса. Это дало ожидаемое поведение в базе данных, но тогда экземпляры экзаменов не были доступны в представлениях. Я также попробовал множество комбинаций создания OneToOneFields, чтобы связать модели экзамена и даты, но ни одна из них не дала желаемого поведения.

Я пытался выяснить, почему это происходит в течение довольно долгого времени. Любая помощь будет оценена!

...