django 3 таблицы запросов - PullRequest
0 голосов
/ 05 июля 2018

У меня есть 3 таблицы, заполненные из моей прежней БД Postgresql. Мне удалось получить некоторые данные из таблицы VLAN, но у меня проблемы с получением всех данных из 3 разных таблиц и помещением их в таблицу, которую я создал на рисунке. Я пробовал несколько наборов запросов, таких как список (цепочка (nameOfTables ..)) Не могли бы вы мне помочь? Я приложил изображение стола

Например ,, если я хочу выбрать конкретные столбцы и БД из нескольких таблиц ..

выберите vlans.name, vlans.vlan_id, gateways.vip, gateways.master, gateways.vhid, subnets.subnet, subnets.dhcp из vlans, подсетей, шлюзов, где vlans.vlan_id = 2599 и subnets.vlan_id = vlans. vlan_id и gateways.vlan_id = vlans.vlan_id;

Models.py

from django.db import models


class Gateways(models.Model):
    vip = models.GenericIPAddressField(primary_key=True)
    vlan = models.ForeignKey('Vlans', models.DO_NOTHING, blank=True, null=True)
    master = models.GenericIPAddressField(blank=True, null=True)
    backup = models.GenericIPAddressField(blank=True, null=True)
    nat = models.GenericIPAddressField(blank=True, null=True)
    vhid = models.IntegerField(unique=True, blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'gateways'


class Subnets(models.Model):
    subnet = models.TextField(primary_key=True)  # This field type is a guess.
    vlan = models.ForeignKey('Vlans', models.DO_NOTHING, blank=True, null=True)
    dhcp = models.NullBooleanField()
    dhcp_start = models.GenericIPAddressField(blank=True, null=True)
    dhcp_end = models.GenericIPAddressField(blank=True, null=True)
    dns = models.GenericIPAddressField(blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'subnets'


class Vlans(models.Model):
    vlan_id = models.IntegerField(primary_key=True)
    allocated = models.NullBooleanField()
    name = models.TextField(blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'vlans'

Views.py

def niro_list(request):


gateways = Gateways.objects.all()
vlans = Vlans.objects.all()
subnets = Subnets.objects.all()



context = {
    'gateways': gateways,
    'vlans': vlans,
    'subnets': subnets,
}

return render(request, 'niro/niro_list.html', context)

niro_list.html

<div class="table-responsive-sm">
<table class="table">
  <thead>
    <tr>
      <th scope="col"></th>
      <th scope="col">#</th>
      <th scope="col">Name</th>
      <th scope="col">Type(Scenario)</th>
      <th scope="col">Interface</th>
      <th scope="col">Vlan ID</th>
      <th scope="col">RDP</th>
      <th scope="col">Network(CIDR)</th>
      <th scope="col">Nat IP</th>
      <th scope="col">DNS</th>
      <th scope="col">DHCP</th>
      <th scope="col">DHCP pool start</th>
      <th scope="col">DHCP pool end</th>
      <th scope="col">Master IP</th>
      <th scope="col">Backup IP</th>
      <th scope="col">VHID</th>


    </tr>
  </thead>
  <tbody>

  {% for instance in vlans %}

    <tr  #id='items-table'>

      <th scope="row" class="checkbox-row"><input type="checkbox" name="item" /></th>
        <th scope="row">{{ forloop.counter }}</th>
          <td class="item">{{ instance.name }}</td>
          <td class="item"></td>
          <td class="item">{{ instance.vlan_id }} </td>
          <td class="item"> </td>
          <td class="item"> </td>
          <td class="item"> </td>
          <td class="item"> </td>
          <td class="item"> </td>
          <td class="item"> </td>
          <td class="item"> </td>
          <td class="item"></td>
          <td class="item"> </td>
          <td class="item"></td>
          <td class="item"> </td>

{##}
{#        {% empty %}#}
{#            <td><p>No contetns</p></td>#}

    </tr>

    {% endfor %}


  </tbody>
</table>

введите описание изображения здесь

Мне удалось объединить их вместе, но проблема в том, что он возвращает весь набор объектов ... Есть ли способ получить одно значение за значением?

    vlan_query_results = Vlans.objects.select_related('vlan_id').values_list('name', 'gateways__vip', 'gateways__backup', 'gateways__master', 'gateways__nat', 'gateways__vhid', 'subnets__dhcp', 'subnets__dns').order_by('vlan_id')

1 Ответ

0 голосов
/ 06 июля 2018

Если вы знаете, как написать SQL-запрос (кажется, вы это делаете), вы можете просто запустить SQL-запрос самостоятельно. Положите что-то вроде этого на ваш взгляд:

from django.db import connections
with connections.cursor() as cursor:
    cursor.execute(your_sql_query)
    res=cursor.fetchall()

И добавьте результат SQL в контекст вашего шаблона. Затем в контексте вы можете перебрать свой результат. См. документацию для получения более подробной информации.

...