我有一个只有 3 列的疾病表:
- 自动标识。
- 一个代码
varchar(10)
。 - 名字
string
。
但是,它有 14197 条记录。
问题是您的主键是其他模型的外键,但是加载它需要很长时间。
使用django
and PostgreSql
,什么是最推荐的,这样它就不需要很长时间来加载Foreign Key
它template
?
楷模
class Cie10(models.Model):
codigo = models.CharField(max_length=10)
nombre = models.TextField()
def __unicode__(self):
return (u"%s (%s)"%(self.nombre, self.codigo)).strip() or "-"
class EnfermedadGeneral(Enfermedad):
dias = models.IntegerField(validators=[no_negativo])
cie10 = models.ForeignKey(Cie10, verbose_name="diagnóstico Cie10")
soportes = models.FileField(upload_to=crear_ruta_archivo_enfermedad_general, blank=True, null=True)
class Enfermedad(models.Model):
persona = models.ForeignKey(Persona, related_name="enfermo")
responsable = models.ForeignKey(Persona, related_name="responsable")
municipio = models.ForeignKey(Municipio)
zona = models.IntegerField(choices=ZONAS)
sucursal = models.ForeignKey(Sucursal)
area = models.ForeignKey(Area)
cargo = models.ForeignKey(Cargo)
tipo_empleado = models.CharField(max_length=1, choices=TIPO_EMPLEADO)
fecha_ingreso = models.DateField()
fecha_diligenciamiento = models.DateTimeField(auto_now_add=True, blank=True)
fecha = models.DateField(verbose_name="fecha del diagnóstico")
def __unicode__(self):
return (u"%s (%s)"%(self.persona, self.fecha)).strip() or "-"
class Meta:
unique_together = (("persona", "fecha"),)
表单示例
class EnfermedadGeneralForm(forms.ModelForm):
class Meta: model = EnfermedadGeneral
exclude = ('responsable', 'persona', 'sucursal', 'area', 'cargo', 'tipo_empleado', 'fecha_ingreso', 'fecha_diligenciamiento',)
widgets = {
'fecha' : MyDateWidget(),
'municipio': Select2Widget(),
'cie10': Select2Widget(),
'soportes' : MyFileInput(), }
模板中的表格
<form class="form-vertical" enctype="multipart/form-data" method="post">{% csrf_token %}
{% bootstrap_form form layout="horizontal" %}
<button class="btn btn-lg btn-primary pull-right" type="submit" onclick="$('#id_dia_semana').attr('disabled', false);">
Registrar <i class="fa fa-check"></i>
</button>
</form>
查看示例
@login_required
@all_permission_required('novedades.add_enfermedadgeneral')
def crear_enfermedad_general(request, idPersona=None):
persona = None
hoy = datetime.now()
usuario = Persona.objects.get(usuario=request.user)
enfermedadGeneralCreada = request.session.get('nueva_enfermedad_general')
if enfermedadGeneralCreada == True:
del request.session['nueva_enfermedad_general']
if idPersona:
try:
persona = Persona.objects.get(id=idPersona)
except Exception:
return redirect('crear_enfermedad_general')
if request.method == 'POST':
form = EnfermedadGeneralForm(request.POST, request.FILES)
if form.is_valid():
objeto = form.save(commit=False)
objeto.responsable = Persona.objects.get(usuario=request.user)
objeto.persona = persona
objeto.sucursal = persona.sucursal
objeto.area = persona.cargo.area
objeto.cargo = persona.cargo
objeto.tipo_empleado = persona.tipo_empleado
objeto.fecha_ingreso = persona.fecha_ingreso
objeto.soportes = None
objeto.save()
try:
objeto.soportes = request.FILES['soportes']
except Exception:
1
objeto.save()
request.session['nueva_enfermedad_general'] = True
return redirect('crear_enfermedad_general')
form2 = CedulaForm(request.POST)
if form2.is_valid():
persona = form2.cleaned_data['persona']
return redirect('crear_enfermedad_general', persona.id)
else:
form = EnfermedadGeneralForm()
try:
form2 = CedulaForm({'persona': persona.id})
except Exception:
form2 = CedulaForm()
return render(request, 'enfermedad_general.html', {
'enfermedadGeneralCreada': enfermedadGeneralCreada,
'persona': persona,
'form': form,
'form2': form2,
'hoy': hoy,
'usuario': usuario,
})
我不是 100% 确定,因为
Select2Widget
我不知道这个小部件,但如果是这个,你正在渲染中加载 14000 条记录。也许您应该更改小部件,让您在 N 个字符后执行 AJAX 搜索:
你可以用这个
在我看来,搜索的效率不是应用程序的责任,而是数据库的责任。
在数据库中进行高效/廉价查询的最重要的事情是考虑某些事情:
当事情不顺利时,还有其他方法同样重要。
如果您的问题超出了这类问题,请开始研究诸如在内存中缓存之类的事情。
为了确定问题是在查询中还是在其他地方,似乎是这种情况(即呈现 14k 条目的选择),强烈建议使用Django 调试工具栏扩展。在其他有用的信息中,它显示了对数据库进行的查询次数以及执行每个查询所花费的毫秒数。