使用PYODBC使用MSSQL的Django:未保存模型表单



django版本1.8.16PYODBC版本:3.0.11b16

我一直在尝试为项目做出视图/提交表格。我需要实现的基本目的是使用MS SQL Server 2014中的存储过程查看和编辑/保存数据。我能够在查看页面中使用存储的过程,但无法使用编辑使用项目并添加新项目。

models.py

class procedures():
def view_patientsp(self, patid):
    cursor = connection.cursor()
    ret = cursor.execute("EXEC PR_PRES_viewpatient @uid=?  ", (patid))
    cursor.close()
    return ret

class Patient(models.Model):
    patientid = models.AutoField(db_column='PatientID', primary_key=True)  
    pyear = models.DecimalField(db_column='Pyear', max_digits=10, decimal_places=0, blank=True, null=True)  
    dref = models.DecimalField(db_column='DRef', max_digits=10, decimal_places=0, blank=True, null=True)  
    title = models.TextField(db_column='Title', blank=True, null=True)  
    fname = models.TextField(db_column='FName', blank=True, null=True)  
    lname = models.TextField(db_column='LName', blank=True, null=True)  
    dob = models.DateTimeField(db_column='DOB', blank=True, null=True)  
    pamonth = models.TextField(db_column='PAMonth', blank=True, null=True)  
    payear = models.TextField(db_column='PAYear', blank=True, null=True)  
    padays = models.TextField(db_column='PADays', blank=True, null=True)  
    sex = models.TextField(db_column='Sex', blank=True, null=True)

views.py

def view_patient(request):
    if request.method == 'POST':
        form = viewpatientform(request.POST)
        return render(request, 'lis/view.html', {'form': form})
    else:
        form = viewpatientform()
        if form.is_valid():
            procedure = procedures()
            ret = procedure.view_patientsp(request.POST['fields'])
        return render_to_response('lis/view.html', {'form': form})

urls.py

urlpatterns = [
url(r'^$', views.pat_list, name='index'),
url(r'^view/(?P<patid>d+/)$', views.view_patient, name='viewpatient'), ]

view.html

{% block body %}
{% load materializecss %}
{{ form|materializecss }}
<button type="submit" class="btn btn-primary">Submit</button>
{% endblock  %}

您有一些选择。我将尝试在这里概述它们,因为我有一个类似的项目,我们正在使用用另一种语言编写的非常大的网站,并由SQL Server带有存储过程,我们正在缓慢但肯定地迁移到Django。

我们的目标是随着时间的流逝进行完整的重写。这意味着用Django的模型和视图在存储过程中替换逻辑,因为ORM非常强大。我们发现这是对重复的削减,并大大提高了可重复性,从而减少了代码的总量。

您可以使用Django的inspectdb之类的功能来生成一组Django模型来与数据库进行交互。它需要进行一些修饰,但这使我们能够在旧数据库上使用某些功能(例如Django's Admin)进行CRUD操作,而不是编码三层以进行简单的查找表更新。我不建议自定义管理员,而是将其用于做好的工作是开始熟悉Django如何做事的好方法。

您可以使用Django的许多功能(例如模板和表单)来调用存储过程。例如,在FormView中,您可以做这样的事情:

class MyFormView(FormView):
    template_name = 'home.html'
    form_class = MyForm
    success_url = '/hooray/'
    def form_valid(self, form):
        sender = form.cleaned_data['sender']
        message = form.cleaned_data['message']
        cursor = connections['default'].cursor()
        cursor.execute('EXEC usp_insert_message @sender = ?, message = ?', sender, message)
        return super(MyFormView, self).form_valid(form)

但是,请谨慎编码Frankendjango。在过渡期间,我们已经痛苦,以确保两个网站都可以并行运行,并在两者之间共享身份验证。这使我们可以随着时间的推移将功能移至新的Django站点,同时以正确的方式在新代码基础上进行操作。在以正确的方式使用模型,视图和模板的流程之后,您可能会惊喜地开始将事情转移到多快的速度上,尤其是在Django富有的即时包装的生态系统中,您可能会感到惊喜。

最终注意:我强烈建议您的Django数据库引擎使用django-pyodbc-azure(与SQL Server Azure一起使用)。随着时间的流逝,我发现它是最积极的维护,并且刚刚起作用。您可以为Django 1.8安装它:

pip install django-pyodbc-azure<1.9

更多详细信息可以在此处找到:https://github.com/michiya/django-pyodbc-azure

祝你好运!

相关内容

  • 没有找到相关文章

最新更新