如何通过单个 HTML 表单存储共享一对多关系的两个不同 django 模型的数据?

问题描述 投票:0回答:1

我有一个 HTML 表单来填写患者及其医生的详细信息。我使用外键创建了医生和患者模型之间的一对多关系。

表格(docpatent.html)如下所示:

<form action="{% url 'requestlanding' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <h2>
        Patient Details
    </h2>
    <label for="patientName">
        Patient's Name:
    </label>
    <input type="text" id="patientName" name="patientName" required>
    <label for="age">
        Age:
    </label>
    <input type="number" id="age" name="age" required>
    <label for="gender">
        Gender:
    </label>
    <select id="gender" name="gender" required>
        <option value="male">
            Male
        </option>
        <option value="female">
            Female
        </option>
        <option value="other">
            Other
        </option>
    </select>
    <label for="contactNumber">
        Contact Number:
    </label>
    <input type="tel" id="contactNumber" name="contactPatient" required>
    <label for="email">
        Email:
    </label>
    <input type="email" id="email" name="emailPatient" required>
    <label for="media">
        Upload patient's picture:
    </label>
    <input type="file" id="media" name="wrecommend" accept="image/*,video/*,pdf/*">
    <h2>
        Doctor Details
    </h2>
    <label for="doctorName">
        Doctor's Name:
    </label>
    <input type="text" id="doctorName" name="doctorName" required>
    <label for="specialization">
        Specialization:
    </label>
    <input type="text" name="specialization" id="specialization" required>
    <label for="contactNumber">
        Contact Number:
    </label>
    <input type="tel" id="contactNumber" name="contactDoctor" required>
    <p>
        (All the information must be correct and proper)
    </p>
    <button type="submit">
        Submit
    </button>
</form>

我创建了患者和医生模型如下:

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator


class Doctor(models.Model):
    name = models.CharField(max_length=50, blank=False)
    phone = models.IntegerField(
        validators=[MinValueValidator(1000000000), MaxValueValidator(9999999999)],
        blank=False,
    )
    specialization = models.CharField(max_length=50, blank=False, null=True)

    def __str__(self):
        return self.name


class Patient(models.Model):
    GENDER = (("Male", "Male"), ("Female", "Female"), ("Others", "Others"))

    name = models.CharField(max_length=50, blank=False, default=None)
    email = models.EmailField(max_length=50, blank=False, default=None)
    phone = models.IntegerField(
        validators=[MinValueValidator(1000000000), MaxValueValidator(9999999999)],
        blank=False,
        default=None,
    )
    age = models.PositiveIntegerField(blank=False, null=True, default=0)
    gender = models.CharField(max_length=6, choices=GENDER, blank=False, default=None)
    doctor = models.ForeignKey(Doctor, on_delete=models.PROTECT)
    wrecommend = models.FileField(
        upload_to="wrecommend", max_length=50, blank=False, null=True
    )

    def __str__(self):
        return self.name

这是我创建的视图

def requestlanding(request):
    if request.method == "POST":
        p_name = request.POST.get("patientName")
        p_age = request.POST.get("age")
        p_gender = request.POST.get("gender")
        p_phone = request.POST.get("contactPatient")
        p_email = request.POST.get("emailPatient")
        p_wrecommend = request.POST.get("wrecommend")

        d_name = request.POST.get("doctorName")
        d_phone = request.POST.get("contactDoctor")
        d_specialization = request.POST.get("specialization")

        doctor = Doctor.objects.create(
            name=d_name, phone=d_phone, specialization=d_specialization
        )

        doctor.save()

        patient = Patient.objects.create(
            doctor=doctor,
            name=p_name,
            email=p_email,
            phone=p_phone,
            age=p_age,
            gender=p_gender,
            wrecommend=p_wrecommend,
        )

        patient.save()

        return redirect("requestlanding")
    return render(request, "docpatient.html")

**我认为这满足了医患关系,即一对多关系,但是在添加同一医生的两名患者时,数据库表中的医生详细信息被重复。但医生记录里应该加上病人的名字。

我想在医生记录上注明该医生的患者姓名。**

请帮我解决这个问题。

python django database django-models django-forms
1个回答
0
投票

当然,每次视图处理成功时,你的代码都会创建一个医生和病人,你需要做的是在创建对象之前检查医生是否存在,这可以通过 Django 来完成 get_or_create

doctor = Doctor.objects.get_or_create(name=d_name, phone=d_phone, specialization=d_specialization)
#doctor.save()
© www.soinside.com 2019 - 2024. All rights reserved.