Django M2M与addititional数据通过

时间:2017-05-01 16:19:12

标签: python django m2m

我的问题如下。我正在从网页上的表格中保存患者的数据。表单由models.py中的模型定义生成。我保存的信息是姓名,姓氏等。我有一个用于诊断的字段,使用multichoiceField选择,我使用manytomany保存它 保存数据后,将为预期分配给每位患者的诊断创建单独的表。该表包含诊断及其适用的患者ID。每个诊断都保存为单独的记录。 除了选择诊断之外,我还保存了诊断的日期。您将在下面的models.py和form.py代码中看到我的意思 我想将诊断的日期也保存在表格中,但我无法弄清楚如何做到这一点。我尝试过关注文档:https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany以及SO上的其他一些帖子,但无法弄清楚如何做到这一点。我无法弄清楚需要如何设置视图,表单和模型才能实现。有可能这样做,如果是这样的话怎么样?我尝试过使用一个很多很多的中间模型和#39;到#,但我不明白。对此的任何帮助将不胜感激。

以下是我的代码的简化版本:

models.py:

class diagnosisChoices(models.Model):  #This represents the list in the drop down menu for the different diagnosis.
    diagnosis = models.CharField(max_length = 50)
    def __str__(self):              
        return self.diagnosis

class PatientData(models.Model):
    Name = models.CharField(max_length=100)
    Surname = models.CharField(max_length=100)

    dateOfBirth = models.DateField(default = datetime.datetime.now())
    diagnosis = models.ManyToManyField(
        'diagnosisChoices',
        #on_delete=models.CASCADE,
    )

views.py:

 def patientDataView(request):
    uId = request.user.id 

    if request.method == "POST":
    form = PatientDataForm(request.POST)

    if form.is_valid():
        model_instance = form.save(commit=False)
        model_instance.timestamp = timezone.now()
        model_instance.save()
        #model_instance.add(uId)
        form.save_m2m()          
        return HttpResponseRedirect('/dataBase')

    else:

    form = PatientDataForm()

    return render(request, "dataBaseTest.html", {'form': form})
    date_of_diagnosis = models.DateField(default=datetime.datetime.now())

forms.py

from django.forms import ModelForm
from django import forms
from .models import PatientData
from .models import diagnosisChoices #This is the list of diagnosis in the dropdown
from django.forms import extras
import datetime

from functools import partial
class PatientDataForm(ModelForm):
    class Meta:
        now = datetime.datetime.now()
        thisYear = now.year
        DateInput = partial(forms.DateInput, {'class': 'datepicker'})
        widgets = {
        }

        model = PatientData
        fields = ['Name', 
                'Surname',
                'dateOfBirth',
                'diagnosis',
                'date_of_diagnosis',
                ]

谢谢, 托马斯

1 个答案:

答案 0 :(得分:0)

你没有得到的主要内容是models.py,所以我会专注于它。

您需要使用三个表来执行您所描述的内容:diagnosisDataPatientData和'成员资格'我称之为diagnosisPatient的表格。然后你建立你的模型:

class diagnosisChoices(models.Model):
    diagnosis = models.CharField(max_length = 50)

class PatientData(models.Model):
    Name = models.CharField(max_length=100)
    Surname = models.CharField(max_length=100)
    dateOfBirth = models.DateField(default = datetime.datetime.now())
    diagnosis = models.ManyToManyField('diagnosisChoices',through='diagnosisPatient')

class diagnosisPatient(models.Model):
    patient = models.ForeignKey('PatientData')
    diagnosis = models.ForeignKey('diagnosisChoices') 
    dateOfDiagnosis = models.DateField()

以这种方式构建模型后,您应该像往常一样保存PatientDatadiagnosisChoices个实例。对于多对多关系,您应该使用适当的外键和日期在diagnosisPatient表上手动保存它。您可以像往常一样使用PatientData函数查询objects.all()模型中的多对多关系。

要记住的是,django中的ManyToMany关系总是在幕后为您创建一个新的成员资格表。因此,当您不需要在关系上插入额外信息时,diagnosisPatient表只由两个外键组成,并且它是隐藏的。关于这种关系的直接论证只是让这个表格显而易见,并让你控制回来放置你喜欢的任何新关系。