Django: problem between id, foreignkey and views

I need help to understand a part of django.

I can't understand the relationships between foreignkeys, or rather the relationships within relationships.

Let me explain: I'm making a travel app.

In each trip, there is the possibility to add an activity. These activities are unique per trip and are therefore linked via a Foreignkey. Each activity also has a unique address. These are also linked to the activities via a Foreignkey.

I would like to do 2 things:

  1. Post each trip with these activities. For each of the activities, the addresses should be displayed.
  2. Display the lists of trips, showing the country where the activities take place "country" of "addresse" of "activities".
 # models.py
class Adresse(models.Model):
    libelle = models.fields.CharField(max_length=100)
    numero = models.fields.IntegerField(null=True)
    street = models.fields.CharField(max_length=100)
    code = models.fields.IntegerField(null=True)
    city = models.fields.CharField(max_length=100, null=True)
    country = models.ForeignKey(Country, null=True, blank=True, on_delete=models.SET_NULL)
    def __str__(self):
        return f'{self.libelle}'

class Trip(models.Model):
    title = models.fields.CharField(max_length=100)
    traveller = models.ManyToManyField(Character)
    date_start = models.DateField(default=date.today)
    date_end = models.DateField(default=date.today)
    def __str__(self):
        return f'{self.title}'

class Activity(models.Model):
    TRANSPORT = 'TRANSPORT'
    HEBERGEMENT = 'Hébergement'
    RESTAURATION = 'RESTAURATION'
    LOISIR = 'LOISIR'

    ROLE_CHOICES = (
        (TRANSPORT, 'Transport'),
        (HEBERGEMENT, 'Hébergement'),
        (RESTAURATION, 'Restauration'),
        (LOISIR, 'Loisir'),
    )
    category = models.CharField(max_length=30, choices=ROLE_CHOICES)
    trip = models.ForeignKey(Trip, null=True, blank=True, on_delete=models.SET_NULL)
    adresse = models.ForeignKey(Adresse, null=True, blank=True, on_delete=models.SET_NULL)
    date_start = models.DateField(default=date.today)
    date_end = models.DateField(default=date.today)
    class Meta:
        verbose_name_plural = "Activities"
# views.py
@login_required
def travel_list(request):
    travels = Trip.objects.all()
    template = 'travel/travel_list.html'
    context = {'travels' : travels}
    return render(request, template, context)

@login_required
def travel_detail(request, travel_id):
    travel = get_object_or_404(Trip, id=travel_id)
    activities = Activity.objects.filter(trip_id=travel_id)
    adresses = Adresse.objects.get(id=activities.adresse)
    travellers = travel.traveller.all().order_by("last_name", "first_name")
    template = 'travel/travel_detail.html'
    context = {
        'travel': travel,
        'activities' : activities,
        'travellers' : travellers,
        'adresses' : adresses,
        }
    return render(request, template, context)
{% extends 'base.html' %}

{% block content %}

<h2>{{travel.title}}</h2>

{% if activities %}

<h3>Activités :</h3>

<table>
    
{% for activity in activities %}

{% for adresse in adresses %}
   
<tr>

    <td>{{activity.category}}</td>
    <td>{{adresse.libelle}} - {{adresse.street}} {{adresse.numero}} {{adresse.code}} {{adresse.city}}</td>
    <td>{{activity.date_start}}</td>
    <td>{{activity.date_end}}</td>

</tr>

{% endfor %}

{% endfor %}

</table>

{% else %}

{% endif %}

{% if travellers %}

<h3>Voyageurs :</h3>

{% for traveller in travellers %}
    
<p><a href="{% url 'character-detail' traveller.id %}">{{ traveller.first_name }} {{ traveller.last_name }}</a></p> 
    
{% endfor %}

{% else %}

{% endif %}

{% endblock %}

If someone is kind enough to help me and explain.

Back to Top