Как удалить запись в отношении "многие ко многим" в django?
Я практикую django, создавая очень маленькое приложение. Я сделал систему бронирования авиабилетов, используя 3 таблицы - Аэропорт, Рейс, Пассажир. Вот мои классы моделей:
from django.db import models
# Create your models here.
class Airport(models.Model):
code = models.CharField(max_length=3)
city = models.CharField(max_length=64)
def __str__(self):
return f"{self.city} ({self.code})"
class Flight(models.Model):
origin = models.ForeignKey(Airport, on_delete = models.CASCADE, related_name="departures")
destination = models.ForeignKey(Airport, on_delete = models.CASCADE, related_name = "arrivals")
duration = models.IntegerField()
def __str__(self):
return f"{self.id} {self.origin} to {self.destination}"
# A flight can have multiple passengers or a passenger can board on multiple flights
class Passenger(models.Model):
first = models.CharField(max_length=64)
last = models.CharField(max_length=64)
# flights establishes many to many relationship with Flight table
flights = models.ManyToManyField(Flight, blank=True, related_name="passengers")
def __str__(self):
return f"{self.first} {self.last}"
Мне удалось отобразить список пассажиров и забронировать рейс для конкретного пассажира, но я не могу удалить пассажира с определенного рейса. Проблема в том, что я не совсем понял отношения «многие ко многим» в моделях django. Вот мой фрагмент кода для функций просмотра:
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from .models import *
# Create your views here.
def index(request):
return render(request, "flights/index.html",{
"flights":Flight.objects.all(),
})
def flight(request, flight_id):
flight = Flight.objects.get(pk=flight_id)
#Get all the passengers who are present on the flight
passengers = flight.passengers.all()
#Returns a new QuerySet containing objects that do not match the given lookup parameters.
non_passengers = Passenger.objects.exclude(flights=flight).all() # Returns all the passenger who are not on the particular flight
return render(request, "flights/flight.html", {
"flight":flight,
"passengers":passengers,
"non_passengers":non_passengers,
})
def book(request, flight_id):
if request.method == "POST":
#Access the the flight by specifying the primary key
flight = Flight.objects.get(pk=flight_id)
#Finding the passenger id and passenger from submitted data
passenger = Passenger.objects.get(pk=int(request.POST["passenger"]))
#Add passenger to the flight
passenger.flights.add(flight)
#Redirect the user to flight page
return HttpResponseRedirect(reverse("flight", args=(flight.id,)))
def delete(request, flight_id):
if request.method == "POST":
#Access the the flight by specifying the primary key
flight = Flight.objects.get(pk=flight_id)
#Finding the passenger id and passenger from submitted data
passenger_id = Passenger.objects.get(pk=int(request.POST["passenger"]))
print(passenger)
#Remove passenger from the flight
passenger.flight.delete(passenger_id)
#Redirect the user to flight page
return HttpResponseRedirect(reverse("flight", args=(flight.id)))
Вот мой HTML-код для отображения системы бронирования -
{% extends "flights/layout.html" %}
{% block body %}
<h1>Flight {{ flight.id }}</h1>
<ul>
<li>Origin: {{ flight.origin }}</li>
<li>Destination: {{ flight.destination }}</li>
<li>Duration: {{ flight.duration }}</li>
</ul>
<h3>Passengers</h3>
<ul>
{% for passenger in passengers %}
<li>{{passenger}}</li>
{% empty %}
<li>No passengers</li>
{% endfor %}
</ul>
<h2>Add Passenger</h2>
<form action="{% url 'book' flight.id %}" method="POST">
{% csrf_token %}
<select name="passenger" id="">
{% for passenger in non_passengers %}
<option value="{{passenger.id}}">{{ passenger }}</option>
{% endfor %}
</select>
<input type="submit">
</form>
<h2>Delete Passenger</h2>
<form action="{% url 'delete' flight.id %}" method="POST">
{% csrf_token %}
<select name="passenger" id="">
{% for passenger in passengers %}
<option value="{{passenger.id}}">{{ passenger }}</option>
{% endfor %}
</select>
<input type="submit">
</form>
<a href="{% url 'index' %}">Back to Flight List</a>
{% endblock %}
Может ли кто-нибудь объяснить мне отношения «многие ко многим» в django и предложить мне, как удалить пассажира с определенного рейса (или отменить его бронирование)?