如何在Django中将数据添加到两个依赖表中

2024-09-27 20:18:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的文件(如下),我不知道如何将疾病和症状添加到数据库(1-M关系)

网页看起来像:

数据名称:|

类型:|

症状:增加

|完成|


  1. 添加dname,疾病类型
  2. 添加该疾病的第一个症状并单击“添加”按钮
  3. 添加相同疾病的第二个症状,然后单击“添加”按钮
  4. 针对所有症状
  5. 单击“完成”以完成第一个疾病的插入

我无法处理这种情况。由于我必须添加多个症状,如何访问疾病id,因为此时数据库中不存在疾病条目。在

模型.py

class Disease(models.Model):
    did = models.AutoField(verbose_name='Disease Id', primary_key=True)
    dName = models.CharField(max_length=20)
    dtype = models.CharField(max_length=10)

class Symptoms(models.Model):
    sid = models.AutoField(verbose_name='Symptoms Id',primary_key=True)
    sname = models.CharField(max_length=10)
    disease = models.ForeignKey(Disease,related_name='symptoms',on_delete=models.CASCADE)

表单.py

^{pr2}$

视图.py

class AddDisease(TemplateView):
    template_name = 'personal/disease.html'

    def get(self, request):
        dform = DiseaseForm()
        sform = SymptomForm()
        ddata = Disease.objects.all()
        sdata = Symptoms.objects.all()
        args = {'dform': dform,'sform': sform,'ddata':ddata,'sdata':sdata}

        return render(request,self.template_name,args)

疾病.html

<body>
   <form method="post">
       {% csrf_token %}
       {{ dform.as_p }}
       {{ sform.as_p }}
       <input type="button" class="btn" name="addbtn" value="click">
   </form>
</body>

Tags: namepy症状modelslengthmaxclass疾病
1条回答
网友
1楼 · 发布于 2024-09-27 20:18:49

Disease被称为外键,正如您所说,在知道Disease的实际id之前,不能添加任何{}。Disease和{}之间的关系是您定义的1:m。虽然我认为它们之间的理想关系是m:n,因为一个Disease可以有很多Symptom,而一个{}可以属于多个{},但在这种情况下,您需要一个存储相关记录的中间表,例如(disease_id, symptom_id),请参见{a1}

无论如何,在您的场景中,您可以执行的步骤是:

  1. 首先获取或创建一个Disease实例。您可以定义一个函数,例如get_or_create_disease,该函数首先查询数据库,检查dname是否存在于数据库中,如果不存在,则插入一个新实例并返回新插入的实例,否则返回现有实例。在
  2. 现在您有了拥有idDisease实例,您可以插入所有Symptom

下面是一个伪代码:

def get_or_create_disease(db, dname):
    di = db.session.query(Disease).filter(dname=dname).one_or_none()
    if di is not None:
        return di
    else:
        di = Disease(dname=dname)
        db.session.add(di)
        try:
            db.session.commit()
            return di
        except SQLAlchemyError as e:
            db.session.rollback()
            ...

def handle_data(db, form):
    di = get_or_create_desease(db,form['dname'])
    for sp in form['symptoms']:
        di.symptoms.append(Symptom(sp))
    try:
        db.session.commit()
    exception SQLAlchemyError as e:
        db.session.rollback()
        ...

pseudo只显示逻辑的。我只有SQLAlchemy的经验。在

希望这会有帮助。在

相关问题 更多 >

    热门问题