Django с MSSQL с использованием Pyodbc: формы моделей не сохраняются

Версия 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)

просмотры.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'), ]

вид.html

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

person Romil Bahukhandi    schedule 13.12.2016    source источник
comment
Есть ли причина, по которой вы используете хранимую процедуру, а не Django ORM? Django создан для генерации собственного SQL через ORM. Использование хранимых процедур в этом случае очень не рекомендуется. Также укажите, какую версию django-pyodbc вы используете, и ссылку на нее, так как существует довольно много версий. Кроме того, вы используете Django в Windows или Linux?   -  person FlipperPA    schedule 13.12.2016
comment
@FlipperPA Я использую 64-разрядную версию Windows 7 Django-Pyodbc : Версия: 1.0.1 Я создаю приложение поверх существующего приложения Windows, поэтому использую Django. Я использую существующие хранимые процедуры, чтобы любые изменения в приложении Windows также учитывались в веб-приложении.   -  person Romil Bahukhandi    schedule 14.12.2016


Ответы (1)


У вас есть несколько вариантов. Я попытаюсь изложить их здесь, так как у меня есть аналогичный проект, в котором мы берем очень большой сайт, написанный на другом языке и поддерживаемый SQL Server с хранимыми процедурами, который мы медленно, но верно переносим на Django.

Мы стремимся к полному переписыванию с течением времени. Это означает замену логики в хранимых процедурах моделями и представлениями Django, поскольку ORM очень мощный. Мы считаем, что это сокращает количество повторений и значительно улучшает возможность повторного использования, тем самым уменьшая общий объем кода.

Вы можете использовать такие функции, как inspectdb Django, для создания начального набора моделей Django для взаимодействия с вашей базой данных. Это потребует некоторой доработки, но это позволило нам использовать некоторые функции (например, администратора Django) для грубых операций со старой базой данных, вместо того, чтобы кодировать три уровня для простых обновлений таблицы поиска. Я бы не рекомендовал настраивать админку, но использовать ее для того, что у нее хорошо получается, — это хороший способ начать знакомство с тем, как работает 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-pyodbc-azure (он работает с SQL Server или Azure) для ядра базы данных Django. Со временем я обнаружил, что он наиболее активно поддерживается и просто работает. Вы можете установить его для Django 1.8 следующим образом:

pip install django-pyodbc-azure<1.9

Дополнительные сведения можно найти здесь: https://github.com/michiya/django-pyodbc-azure

Удачи!

person FlipperPA    schedule 14.12.2016