【问题标题】:Django M2M with addititional data with through带有附加数据的 Django M2M 通过
【发布时间】:2017-05-01 16:19:12
【问题描述】:

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

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

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

谢谢, 托马斯

【问题讨论】:

    标签: python django m2m


    【解决方案1】:

    您没有得到的主要内容是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 表中。您可以像往常一样使用objects.all() 函数从PatientData 模型中查询多对多关系。

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

    【讨论】:

    • 谢谢蒂科。您关于如何设置 models.py 文件的示例有很大帮助。我已设法将 M2M 字段保存为今天的日期,而不是从表单中输入的日期。有没有办法让用户在 dateOfDiagnosis 字段的表单中输入日期,以便可以将其与诊断一起保存。理想情况下,我只希望将此日期保存在“diagnosisPatient”表中,而不是“patientData”表中,但这是一个很好的选择。
    • 好的,那么我必须告诉你一些我并不特别自豪的事情:我不使用也不知道如何使用 django forms.py。每次我尝试时,它都没有做我想做的事情,就像你现在遇到的情况一样......所以我对表单所做的一切都是手动 javascript,它与 django 表单没有任何联系。简而言之,我不知道如何弯曲表格以适应这种情况!对不起:|一个快速的谷歌让我找到了这个看起来很有帮助的链接:timlwhite.com/2012/07/21/…
    • 我之前找到了那个链接并玩了一下,但似乎有很多错误。如果我不能让我的模型和表单像我想要的那样工作,我可能会创建应该实现的单独表单,但这会变得很麻烦。在这种情况下,我将不得不研究如何使用 ID 键在表之间进行引用。 (我是新手,所以需要一些时间)。再次感谢您的帮助。
    • 酷。乐意效劳!祝你好运!
    猜你喜欢
    • 2012-02-29
    • 2017-02-19
    • 2011-05-24
    • 1970-01-01
    • 2015-04-25
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多