2017-09-02 64 views
0

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

网页看起来像:

dname:| ____________ |

类型:| ____________ |

症状:| ___________ | |添加|

| finish |


  1. 添加DNAME,疾病的类型
  2. 新增第1个症状是病的,然后单击添加按钮
  3. 添加第二个症状相同的疾病,然后单击添加按钮
  4. 做所有的症状
  5. 点击完成即可完成第一种疾病的插入

我是无法管理这种情况。由于我必须添加多个症状,我如何才能访问Disease id,因为此时数据库中不存在疾病入口。

models.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) 

forms.py

class DiseaseForm(ModelForm): 
    dname = forms.CharField() 
    type = forms.ChoiceField() 

    class Meta: 
     model = Disease 
     fields = "__all__" 

class SymptomForm(ModelForm): 
    sname = forms.CharField() 

    class Meta: 
     model = Symptoms 
     fields = "__all__" 

Views.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) 

disease.html

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

回答

0

Disease被称为外键,就像你说的,你不能添加任何Symptom你知道Disease实际id之前。按照您的定义,DiseaseSymptom之间的关系为1:m。虽然我认为他们之间的理想关系是m:n,因为Disease可以有很多Symptom S和Symptom可能属于很多Disease S,在这种情况下,你需要存储的相关记录中的中间表,例如,(disease_id, symptom_id),看到Many-to-Many

不管怎样,在你的情况,你可以做的步骤是:

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

这里是一个伪代码:

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() 
     ... 

伪仅示出了逻辑。我只有SQLAlchemy的经验。

希望这会有所帮助。

0

按照这些步骤,优雅的方式做你正在做的事情。

一些安装

pip install django-taggit 
pip install taggit-selectize 

settings.py

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    ... 
    ... 
    'taggit', 
    'taggit_selectize', 
] 

urls.py

urlpatterns = [ 
    ... 

    url(r'^taggit/', include('taggit_selectize.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
    ... 
] 

现在第一迁移论文

python manage.py make-migrations 
python manage.py migrate 

models.py

from taggit_selectize.managers import TaggableManager 
from taggit.models import TaggedItemBase 


class TaggedSymptoms(TaggedItemBase): 
    content_object = models.ForeignKey('Disease') 

class TaggedFood(TaggedItemBase): 
    content_object = models.ForeignKey('Disease') 

class TaggedMedicine(TaggedItemBase): 
    content_object = models.ForeignKey('Disease') 

class Disease(models.Model):  
    name = models.CharField(max_length=20) 
    type = models.CharField(max_length=10) 

    symptoms = TaggableManager(through=TaggedSymptoms) 
    symptoms.rel.related_name = "+" 

    medicine = TaggableManager(through=TaggedMedicine) 
    medicine.rel.related_name = "+" 

    food = TaggableManager(through=TaggedFood) 
    food.rel.related_name = "+" 

现在,这样做了!

在您的管理面板中尝试一下,检查一切是否按照您的需要进行。 然后您可以创建表单并继续。

希望它有帮助!

+0

This Works ... thanks !!! –

+0

如果我必须添加2个相同的字段一样, 1)食品= TaggableManager 2)药= TaggableManager 错误:你不能有两个taggble经理 帮我在这也.. –

+0

@CharmiShah我已经更新我的答案,试试看,如果有任何问题,请告诉我。 –

相关问题