Python Django M2M,带有通过的附加数据

Python Django M2M,带有通过的附加数据,python,django,m2m,Python,Django,M2m,我的问题如下。我正在从网页上的表格中为患者保存数据。表单是根据models.py中的模型定义生成的。我保存的信息包括姓名和姓氏。我有一个诊断字段,它是使用multichoiceField选择的,我使用manytomany保存它。 保存数据后,将为按预期分配给每个患者的诊断创建一个单独的表。该表包含诊断及其适用患者的ID。每个诊断都保存为单独的记录。 除了选择诊断之外,我还保存了进行诊断的日期。您将在下面的models.py和form.py代码中看到我的意思。 我想把诊断的日期也保存在表中,但我不

我的问题如下。我正在从网页上的表格中为患者保存数据。表单是根据models.py中的模型定义生成的。我保存的信息包括姓名和姓氏。我有一个诊断字段,它是使用multichoiceField选择的,我使用manytomany保存它。
保存数据后,将为按预期分配给每个患者的诊断创建一个单独的表。该表包含诊断及其适用患者的ID。每个诊断都保存为单独的记录。 除了选择诊断之外,我还保存了进行诊断的日期。您将在下面的models.py和form.py代码中看到我的意思。
我想把诊断的日期也保存在表中,但我不知道怎么做。我已经试过了以下文档:以及其他一些关于SO的帖子,但是我不知道怎么做。我不知道需要如何设置视图、表单和模型才能实现。有可能做到这一点吗?如果有,如何做到?我试过使用一个中间模型,它有很多个和“通过”,但我不理解它。在此方面的任何帮助都将不胜感激

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

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',
                ]
谢谢,
Thomas

您没有得到的主要内容是models.py,因此我将重点介绍它

您需要三个表来完成您所描述的操作:
diagnosisData
PatientData
和一个“成员”表,我称之为
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()
以这种方式构建模型后,您应该像往常一样保存
PatientData
Diagnosticschoices
实例。对于多对多关系,应使用适当的外键和日期手动将其保存在
diagnosisPatient
表中。您可以像往常一样使用
objects.all()
函数从
PatientData
模型中查询多对多关系


这里要记住的是,django的许多关系总是在幕后为您创建一个新的成员表。因此,当您不需要插入有关关系的额外信息时,
diagnostispatient
表仅由两个外键组成,并且它是隐藏的。关于这段关系的最终争论只是让这张桌子曝光,让你重新控制你喜欢的新关系

谢谢提科。您关于如何设置models.py文件的示例帮助很大。我已设法将M2M字段保存为今天的日期,而不是从表单中输入的日期。是否有办法让用户在表单中为dateOfDiagnosis字段输入日期,以便与诊断一起保存。理想情况下,我只希望将此日期保存在“Diagnostispatient”表中,而不希望保存在“patientData”表中,但这是一个很好的选择。好的,那么我必须告诉你一些我并不特别自豪的事情:我不使用,也不知道如何使用django forms.py。每次我尝试,它都没有达到我想要的效果,就像你现在遇到的情况一样。。。所以我对表单所做的一切都是手动javascript,它与django表单没有任何联系。简言之,我不知道如何弯曲形状以适合此情况!Sry:|一个快速的谷歌让我找到了这个链接,看起来很有帮助:我以前找到过这个链接并玩过它,但似乎有很多错误。如果我不能让我的模型和表单像我想要的那样工作,我可能会创建单独的表单来实现,但这会变得很麻烦。在这种情况下,我必须解决如何在具有ID键的表之间进行引用。(我是新手,所以需要一些时间)。再次感谢你的帮助。酷。很乐意帮忙!祝你好运!