You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django医生预约APP问题:无法向Appointment数据库添加数据

解决Django预约应用中无法添加Appointment数据的问题

核心问题根源

你的Appoiment模型里,doctor_name是ManyToManyField类型,这种字段不能直接通过create()方法传入字符串(你前端传的是医生名字),它需要关联的是Doctors模型的实例,而非纯文本。另外模型类名存在拼写错误(Appoiment应为Appointment),建议修正以避免后续混淆。

步骤1:修正模型(可选但推荐)

先把模型类名和字段拼写统一修正:

from django.db import models

class Doctors(models.Model):
    doctor_name = models.CharField(max_length=80)
    specialization_doctor = models.CharField(max_length=80)

    def __str__(self):
        return self.doctor_name


class Appointment(models.Model):
    doctor_name = models.ManyToManyField(Doctors)
    date_appointment = models.DateField()  # 修正字段拼写
    time_appointment = models.TimeField()   # 修正字段拼写
    patient_name = models.CharField(max_length=80)
    patient_phone = models.CharField(max_length=15)
    reason_for_visit = models.TextField(max_length=400)

    def __str__(self):
        return self.patient_name

步骤2:修改views.py的创建逻辑

ManyToMany字段不能在create()中直接赋值,必须先创建Appointment实例,再通过add()方法关联医生实例:

from django.shortcuts import render
from .models import Doctors, Appointment  # 同步修改类名
from django.http import HttpResponseRedirect

def main(request):
    # 直接获取医生实例列表,比取values更实用
    doctors = Doctors.objects.all()
    list_of_doctors = [doc.doctor_name for doc in doctors]

    patient = None  # 初始化改为None更合理
    if request.method == 'POST':
        doctor_name = request.POST.get('doctor_name')
        date_appointment = request.POST.get('date')
        time_appointment = request.POST.get('time')
        name = request.POST.get('name')
        phone = request.POST.get('phone')
        reason = request.POST.get('reason')

        # 1. 先根据名字获取对应的医生实例
        try:
            doctor = Doctors.objects.get(doctor_name=doctor_name)
        except Doctors.DoesNotExist:
            # 处理医生不存在的异常,返回错误提示
            return render(request, 'main.html', {
                'list_of_doctors': list_of_doctors,
                'error': '所选医生不存在'
            })

        # 2. 创建Appointment实例,暂不处理ManyToMany字段
        patient = Appointment.objects.create(
            date_appointment=date_appointment,
            time_appointment=time_appointment,
            patient_name=name,
            patient_phone=phone,
            reason_for_visit=reason
        )

        # 3. 关联医生到ManyToMany字段
        patient.doctor_name.add(doctor)
        # 如果支持多选医生,可传入多个实例:patient.doctor_name.add(doctor1, doctor2)

    return render(request, 'main.html', {
        'list_of_doctors': list_of_doctors,
        'patient': patient
    })

额外优化建议

  • 用Django表单自动处理验证和创建,比手动取POST数据更安全:
# forms.py
from django import forms
from .models import Appointment, Doctors

class AppointmentForm(forms.ModelForm):
    doctor_name = forms.ModelChoiceField(
        queryset=Doctors.objects.all(),
        label='选择医生',
        to_field_name='doctor_name'
    )

    class Meta:
        model = Appointment
        fields = ['doctor_name', 'date_appointment', 'time_appointment', 'patient_name', 'patient_phone', 'reason_for_visit']

然后在views中简化逻辑:

def main(request):
    doctors = Doctors.objects.all()
    list_of_doctors = [doc.doctor_name for doc in doctors]

    if request.method == 'POST':
        form = AppointmentForm(request.POST)
        if form.is_valid():
            form.save()  # 表单自动处理ManyToMany关联和数据验证
            return HttpResponseRedirect('/success/')  # 跳转成功页面
    else:
        form = AppointmentForm()

    return render(request, 'main.html', {
        'list_of_doctors': list_of_doctors,
        'form': form
    })

这种方式能自动校验日期、格式等合法性,减少手动代码的错误。

内容的提问来源于stack exchange,提问作者Via4eslav Tka4enko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:35:41