Django With MSSQL using Pyodbc:未保存模型表单

Posted

技术标签:

【中文标题】Django With MSSQL using Pyodbc:未保存模型表单【英文标题】:Django With MSSQL using Pyodbc: Model Forms not being saved 【发布时间】:2016-12-13 16:27:29 【问题描述】:

Django 版本 1.8.16 pyodbc 版本:3.0.11b16

我一直在尝试为项目制作视图/提交表单。 我需要实现的基本目标是使用 MS SQL Server 2014 中的存储过程查看和编辑/保存表单中的数据。我可以在视图页面中使用存储过程,但无法通过编辑来执行此操作项目并添加一个新项目。

模型.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  %

【问题讨论】:

您使用存储过程而不是 Django ORM 是否有原因? Django 通过 ORM 生成自己的 SQL。非常不建议在这种情况下使用存储过程。还请包括您正在使用的 django-pyodbc 版本及其链接,因为有很多版本。另外,你是在 Windows 还是 Linux 上运行 Django? @FlipperPA 我正在使用 Windows 7 64 位 Django-Pyodbc:版本:1.0.1 我正在现有 Windows 应用程序之上构建应用程序,因此使用 Django。我正在使用现有的存储过程,因此 Windows 应用程序中的任何更改都将包含在 Web 应用程序中 【参考方案1】:

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

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

您可以使用 Django 的inspectdb 等功能来生成一组初始 Django 模型以与您的数据库进行交互。它需要一些修饰,但这使我们能够使用一些功能(如 Django 的管理员)对旧数据库进行 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

祝你好运!

【讨论】:

以上是关于Django With MSSQL using Pyodbc:未保存模型表单的主要内容,如果未能解决你的问题,请参考以下文章

MSSQL django_pyodbc 连接问题

[Webpack 2] Use Karma for Unit Testing with Webpack

MSSql (Compact) DELETE-Query with JOIN

Kafka Connect with MSSQL 不适用于删除操作

Django 连接到 MSSQL

如何在 Django 模板中更新由“with”设置的变量