Django и модели с несколькими внешними ключами

Я новичок в Django и до сих пор впечатлен его возможностями. Я играю с более сложными моделями, и у меня проблемы с их правильным использованием. Используя Django 1.3, я пытаюсь написать сводную страницу, которая представила бы три модели ниже со следующей структурой. Другими словами, список поездок с указанием их направлений и занятий.

  • Поездка 1
    • Пункт назначения 1
    • Пункт назначения 2
    • Занятие 1
  • Поездка 2
    • Пункт назначения 1
    • Задание 2

Модели

  • Поездка <-> Пункт назначения <-> Пункт назначения (поездка может иметь несколько пунктов назначения)
  • Действие -> Поездка, Действие -> Пункт назначения (действие определен для поездки в определенное место / пункт назначения)
    class Destination(models.Model):
        city_name=models.CharField()

    class Trip(models.Model):
        departing_on=models.DateField()
        returning_on=models.DateField()
        destinations=models.ManyToManyField(Destination)

    class Activity(models.Model):
        destination=models.ForeignKey(Destination, null=False)
        trip=models.ForeignKey(Trip, null=False)

Я пытаюсь написать представление, которое генерирует страницу со структурой, представленной выше. Основная проблема, с которой я сейчас сталкиваюсь, - это отображение действий для конкретной поездки и пункта назначения. Как видно из приведенного ниже кода, я создаю словарь и сомневаюсь, что это правильно. Кроме того, вид становится

Вид

def list_trip(request, template_name = 'trip-list.html'):
    trips = Trip.objects.all()

    # Build a dictionary for activities -- Is this the right thing to do?
    activities = Activity.objects.filter(trip__in=trips)
    activities_by_trips = dict()
    for activity in activities:
        if activity.trip_id not in activities_by_trips:
            activities_by_trips[activity.trip_id] = dict()

        if activity.destination_id not in activities_by_trips[activity.trip_id]:
            activities_by_trips[activity.trip_id][activity.destination_id] = []

        activities_by_trips[activity.trip_id][activity.destination_id].append(activity)

    return render_to_response(template_name, {
        'page_title': 'List of trips',
        'trips': trips,
        'activities_by_trips': activities_by_trips,
    })

Шаблон


{% block content %}
    {% for trip in trips %}
        {{ trip.id }} - {{ trip.name }}

        {% for destination in trip.destinations.all %}
            {{ destination.city_name }}

            ** This is terrible code -- How to fix that **
            {% for key, value in activities_by_trips|dict_lookup:trip.id %}
                {% if value %}
                    {% for key_prime, value_prime in value|dict_lookup:destination.id %}
                       {{ value_prime.description }}
                    {% endfor %}
                {% endif %}
            {% endfor %}
        {% endfor %}
    {% endfor %}
{% endblock %}

Вкратце, может ли кто-нибудь помочь мне получить сводку обо всех поездках и мероприятиях? Как лучше всего этого добиться? Модель правильная?

Спасибо!

9
задан Martin 26 February 2012 в 02:00
поделиться