Как получить данные из разных таблиц в Django? - PullRequest
0 голосов
/ 23 января 2020

Я новичок в Django и Python,

У меня есть таблица для клиентов и одна для поездок. Я могу отображать клиентов на странице клиентов, и то же самое для поездок.

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

Это мои models.py

from django.db import models
from django.core.validators import RegexValidator


# Create your models here.

class Clientes(models.Model):
    nome = models.CharField(max_length=30)
    apelido = models.CharField(max_length=30)
    morada = models.CharField(max_length=200)
    tel = models.CharField(max_length=9, validators=[RegexValidator(r'^\d{1,10}$')])
    nif = models.CharField(max_length=9, validators=[RegexValidator(r'^\d{1,10}$')])

    def __str__(self):
        return "%s %s" % (self.nome, self.apelido)

    class Meta:
        verbose_name_plural = "Clientes"

class Viagem(models.Model):
    trip_id = models.CharField(max_length=30)
    cliente = models.ForeignKey(Clientes, on_delete=models.CASCADE)
    comp = models.CharField(max_length=30)
    data = models.DateField()
    destino = models.CharField(max_length=30)

    def __str__(self):
        return self.trip_id

    class Meta:
        verbose_name_plural = "Viagens"

Это мои views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Clientes, Viagem

# Create your views here.

def index(request):
    ls= Clientes.objects.all()    
    context = {'ls': ls}
    return render(request, "booking/home.html", context)

def cliente(request, id):
    ls= Clientes.objects.filter(id=id)
    context = {'ls': ls}
    return render(request, "booking/cliente.html", context)

def trip(request):
    ls= Viagem.objects.all()    
    context = {'ls': ls}
    return render(request, "booking/trip.html", context)

и это таблица на home. html

    <table id="selector" class="table is-fullwidth is-hoverable">
    <thead>
      <tr>
        <th>Nome</th>
        <th>Apelido</th>
        <th>Morada</th>
        <th>Telemóvel</th>
        <th>NIF</th>
        <th>Viagens</th>
      </tr>
    </thead>
    <tbody>
        {% for ls in ls %}
      <tr>
        <td>{{ls.nome}}</td>
        <td>{{ls.apelido}}</td>
        <td>{{ls.morada}}</td>
        <td>{{ls.tel}}</td>
        <td>{{ls.nif}}</td>
        <td>{{ls.trip_id}}</td>
      </tr>
      {% endfor %} 
    </tbody>
</table>

Я предполагаю, что это как-то связано с ForeignKey, но ForeignKey на первом класс не будет работать.

Я думал о создании нового def на views.py с использованием таблицы Viagem и другого контекста, но это также не похоже на решение.

Так, кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

0 голосов
/ 23 января 2020

В вашем views.py , в частности, функции cliente, вы хотите добавить следующую строку:

viagems=Viabem.objects.filter(cliente=ls)

изменить следующую строку:

ls= Clientes.objects.filter(id=id)

, так что теперь он показывает:

ls=Clientes.objects.get(id=id)

и затем измените свой контекст на равный:

context = {'ls': ls, 'viagems': viagems}

, тогда вы сможете перебирать различные viagems в вашем html файл шаблона со следующей структурой:

{% for viagem in viagems %}
  {{ viagem.whatever_field }}
{% endfor %}

и это должно быть, я считаю ...

0 голосов
/ 23 января 2020

@ Жоао де Соуза, я обнаружил, что вы хотите показать все поездки, связанные с каждым клиентом.

Прежде всего вы должны получить одного клиента по его идентификатору obj = clients.objects.get(id = id), затем этот идентификатор переходит к указанной модели, подобной этой obj1 = Viagem.objects.filter( id = obj.id)

В соответствии с моим пониманием из приведенного выше вопроса что вы хотите получить справку о том, как вы получаете данные из эталонной модели / таблицы. Django обеспечивает очень простой и гибкий способ получения данных из таблиц.

Не стесняйтесь задавать любые вопросы, если вам нужно больше разъяснений.

0 голосов
/ 23 января 2020

Поскольку вы фильтруете по идентификатору (выбирая один объект), это один из вариантов go:

views.py

from django.shortcuts import get_object_or_404

def cliente(request, id):
    ls = get_object_or_404(Clientes, id=id)
    trips = obj.viagem_set.all()
    context = {'ls': ls, 'trips': trips}
    return render(request, "booking/cliente.html", context)

шаблон. html

<table id="selector" class="table is-fullwidth is-hoverable">
<thead>
  <tr>
    <th>Nome</th>
    <th>Apelido</th>
    <th>Morada</th>
    <th>Telemóvel</th>
    <th>NIF</th>
    <th>Viagens</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>{{ls.nome}}</td>
    <td>{{ls.apelido}}</td>
    <td>{{ls.morada}}</td>
    <td>{{ls.tel}}</td>
    <td>{{ls.nif}}</td>
    <td>{% for trip in trips %}{{ trip.id }}{% endfor %}</td>
  </tr>
  {% endfor %} 
</tbody>

Хотя я не уверен, зачем вам нужно указывать идентификаторы записей в таблице.

...