Использование запроса на соединение SQL с pyodbc mssql django

Я пытаюсь выполнить некоторые операторы соединения, но они не работают.

Все примеры, которые я вижу, относятся к php admin. Я использую SQL Server. Я не хочу выполнять соединения с использованием моделей django, вместо этого я хочу использовать запросы для выполнения соединения и отображения его на моей html-странице.

Пожалуйста, может кто-нибудь сказать мне, как это сделать?

Вот мой код:

модели.py

from django.db import models


class Company(models.Model):
    name = models.CharField(max_length=100)
    contact_name = models.CharField(max_length=100)
    address = models.TextField(max_length=255)
    ph_no = models.CharField(max_length=17)
    tele = models.CharField(max_length=17)
    mail = models.EmailField(max_length=150)
    is_active = models.BinaryField(default=0)


class Client(models.Model):
    company_id = models.IntegerField()
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    ph_no = models.CharField(max_length=17)
    tele = models.CharField(max_length=17)
    mail = models.CharField(max_length=100)
    is_active = models.BinaryField(default=1)```



views.py


from django.shortcuts import render
from .models import Company, Client
import pyodbc
import datetime
import pytz

con = pyodbc.connect('Driver={SQL server};'
                     'Server=;'
                     'Database=Shipping;'
                     'Trusted_Connection=True;')
cursor = con.cursor()
con.autocommit = False

sql_join_client = '''
select Client.Client_id,Company.name,Client.first_name,Client.last_name,
Client.ph_no,Client.tele,Client.mail,Client.IsActive,Client.last_update
from Client
join Company on Client.company_id=Company.company_id
'''
#some names in model differ from the actual names in the db tables
def showclient(request):
    cursor.execute(sql_join_client)  # join
    result = cursor.fetchall()
    return render(request, 'client.html', {'Client': result})

клиент.html

{% extends 'base.html' %}
{% block table_name %}Client{% endblock %}
{% block table_view %}
<thead>
    <tr>
        <th>Client Id</th>
        <th>Company</th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Ph. No.</th>
        <th>Telephone</th>
        <th>E-mail</th>
        <th>Is Active</th>
        <th>Last Updated</th>
        <th>Actions</th>
    </tr>
</thead>
<tfoot>
    <tr>
        <th>Client Id</th>
        <th>Company</th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Ph. No.</th>
        <th>Telephone</th>
        <th>E-mail</th>
        <th>Is Active</th>
        <th>Last Updated</th>
        <th>Actions</th>
    </tr>
</tfoot>
<tbody>
{% for datadisplay in Client%}
    <tr>
        <td>{{datadisplay.client_id}}</td>
        <td>{{datadisplay.company_name}}</td>
        <td>{{datadisplay.first_name}}</td>
        <td>{{datadisplay.last_name}}</td>
        <td>{{datadisplay.ph_no}}</td>
        <td>{{datadisplay.tele}}</td>
        <td>{{datadisplay.mail}}</td>
        <td>{{datadisplay.IsActive}}</td>
        <td>{{datadisplay.last_update}}</td>
        <td>
            <div class="d-grid gap-2">
                <a class="btn btn-warning btn-sm" href="/editclient/{{datadisplay.client_id}}">Edit</a>
                <a class="btn btn-danger btn-sm" href="/deleteclient/{{datadisplay.client_id}}">Delete</a>
            </div>
        </td>
    </tr>
{% endfor %}
</tbody>
<!--<center><a class="btn btn-primary" href="/addcompany">Add Record</a></center>-->
{% endblock %}
{% block add_record_btn %}
<a class="btn btn-primary" href="/addclient" style="margin-left:900px">Add Record</a>
{% endblock %}

Так вот что происходит сейчас

так что это результат, который я получаю. Мне не хватает client_id и company_name.


person Inderjeet Singh Yadav    schedule 18.03.2021    source источник


Ответы (3)


использовать сырой

def showclient(request):
    Client.objects.raw('ursqlcommand')
person JuConte    schedule 18.03.2021
comment
я получил ошибку, которую я разместил ниже - person Inderjeet Singh Yadav; 18.03.2021
comment
неважно, я нашел работу вокруг. но если у вас, ребята, есть другой способ, я мог бы получить название компании из объекта клиента, я весь в ушах. на данный момент я решил это, внеся следующее изменение: - В client.html измените datadisplay.company_name на datadisplay.0 - person Inderjeet Singh Yadav; 19.03.2021

эй @JuConte Я попробовал то, что ты сказал, и это дало мне эту ошибку Я получил эту ошибку после помещения необработанного оператора

person Inderjeet Singh Yadav    schedule 18.03.2021
comment
опубликуйте свой код, пожалуйста - person JuConte; 18.03.2021
comment
я обновил свой вопрос со всеми соответствующими кодами и выводом для него. пожалуйста, проверьте то же самое и укажите мне, где я ошибся - person Inderjeet Singh Yadav; 19.03.2021

Во-первых, вы передаете результат в html, но повторяете клиент, во-вторых, вы можете использовать запрос django, чтобы получить тот же результат в представлении.

def showclient(request, pk): 
    company=get_object_or_404(Company, pk=pk)
    Client.objects.filter(company_id=company)
    return render(request, 'client.html', {'Client': result})

и в хтмл

{% extends 'base.html' %}
{% block table_name %}Client{% endblock %}
{% block table_view %}
<thead>
    <tr>
        <th>Client Id</th>
        <th>Company</th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Ph. No.</th>
        <th>Telephone</th>
        <th>E-mail</th>
        <th>Is Active</th>
        <th>Last Updated</th>
        <th>Actions</th>
    </tr>
</thead>
<tfoot>
    <tr>
        <th>Client Id</th>
        <th>Company</th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Ph. No.</th>
        <th>Telephone</th>
        <th>E-mail</th>
        <th>Is Active</th>
        <th>Last Updated</th>
        <th>Actions</th>
    </tr>
</tfoot>
<tbody>
{% for datadisplay in result %}
    <tr>
        <td>{{datadisplay.client_id}}</td>
        <td>{{datadisplay.company_name}}</td>
        <td>{{datadisplay.first_name}}</td>
        <td>{{datadisplay.last_name}}</td>
        <td>{{datadisplay.ph_no}}</td>
        <td>{{datadisplay.tele}}</td>
        <td>{{datadisplay.mail}}</td>
        <td>{{datadisplay.IsActive}}</td>
        <td>{{datadisplay.last_update}}</td>
        <td>
            <div class="d-grid gap-2">
                <a class="btn btn-warning btn-sm" href="/editclient/{{datadisplay.client_id}}">Edit</a>
                <a class="btn btn-danger btn-sm" href="/deleteclient/{{datadisplay.client_id}}">Delete</a>
            </div>
        </td>
    </tr>
{% endfor %}
</tbody>
<!--<center><a class="btn btn-primary" href="/addcompany">Add Record</a></center>-->
{% endblock %}
{% block add_record_btn %}
<a class="btn btn-primary" href="/addclient" style="margin-left:900px">Add Record</a>
{% endblock %}

проверьте, если полезно

person JuConte    schedule 19.03.2021
comment
это то, что я рендерю клиента в html, который равен результату. проверьте словарь, установленный в операторе return, который работает везде. и о наборе запросов я узнал об этом недавно, и мой проект почти на 60-70% завершен, внесение изменений для этого займет много времени, которого у меня нет. в следующий раз я буду использовать методы queryset и в html-файле, когда вы вызываете результат, он выдаст ошибку. потому что мы не поместили результат в ключ словаря - person Inderjeet Singh Yadav; 19.03.2021
comment
более того, я заставил его работать с некоторыми странными комбинациями, что пока нормально. Если вы хотите знать, пожалуйста, проверьте свой ответ на необработанный, я объяснил, что я сделал, чтобы заставить его работать. - person Inderjeet Singh Yadav; 19.03.2021
comment
Спасибо за вашу помощь Теперь я знаю о необработанном методе - person Inderjeet Singh Yadav; 19.03.2021