Реорганизация многих в многие отношения в Джанго - PullRequest
3 голосов
/ 23 мая 2010

У меня много моделей в моих моделях, и я пытаюсь реорганизовать их на одной из своих страниц.

На моем сайте есть видео. На странице каждого видео я пытаюсь перечислить актеров, которые находятся в этом видео, со ссылками на каждый раз, когда они находятся в видео (ссылки будут переходить к этой части видео)

Вот иллюстрация


Flash Video, встроенный сюда

Актеры ...

Ted smith: 1:25, 5:30
jon jones: 5:00, 2:00

Вот соответствующие части моих моделей

class Video(models.Model):
    actor = models.ManyToManyField( Actor, through='Actor_Video' )
    # more stuff removed

class Actor_Video(models.Model):
    actor = models.ForeignKey( Actor )
    video = models.ForeignKey( Video)
    time = models.IntegerField()

Вот как выглядит моя таблица Actor_Video, может быть, будет легче увидеть, что я делаю

id     actor_id    video_id    time (in seconds)
1        1             3        34
2        1             3        90

Я чувствую, что мне нужно реорганизовать информацию, на мой взгляд, но я не могу понять это. Это не представляется возможным в шаблоне с использованием djangos orm. Я попробовал пару вещей с созданием словарей / списков, но мне не повезло. Любая помощь приветствуется. Благодаря.

Ответы [ 3 ]

1 голос
/ 04 июня 2010

Я думаю, что наиболее распространенный способ сделать это с использованием тега шаблона "regroup":

{% regroup video.actor_video_set.all by actor as video_times %}
{% for actor_times in video_times %}
    <li>{{ actor_times.grouper }}: # this will output the actor's name
    {% for time in actor_times %}
        <li>{{ time }}</li> # this will output the time
    {% endfor %}
    </li>
{% endfor %}

Таким образом, вам не придется использовать больше логики, чем вы хотите в своем шаблоне. Кстати, вы можете прочитать тег перегруппировки здесь

0 голосов
/ 29 мая 2010

Я бы предложил поместить вашу логику в функцию представления, а не в шаблон.Если я правильно понимаю, на каждой странице у вас есть только одно видео, что делает вещи достаточно простыми

def video_view(request,video_id)
    video = Video.objects.get(pk=video_id)
    actors = Actor.objects.filter(video=video)
    #now add a custom property to each actor called times
    #which represents a sorted list of times they appear in this video
    for actor in actors:
        actor.times = [at.time for at in actor.actor_video_set.filter(video=video).order_by('time')] #check syntax here

, тогда в шаблоне вы можете просто просмотреть actor.times:

<ul>
{% for actor in video.actors.all.distinct %}
    <li>{{ actor }}:

        <ul>
    {% for t in actor.times %} #this now returns only the times corresponding to this actor/video
            <li><a href="?time={{ t.time }}">{{ t.time }}</a></li> #these are now sorted

NB - написал весь код здесь без использования IDE, вам нужно проверить синтаксис.надеюсь, это поможет!

для бонусных баллов: определите функцию времени (видео) как пользовательскую функцию класса модели Actor

0 голосов
/ 24 мая 2010

Я вылепил его в словарь временных списков

actor_sets = data['video'].video_actor_set.all()
data['actors'] = {}

for actor_set in actor_sets:
    if not data['actors'].has_key( actor_set.actor ):
        data['actors'][actor_set.actor] = []
        data['actors'][actor_set.actor].append( actor_set.time )

И в шаблоне я зациклился на этом вместо того, чтобы выполнять запросы в реальном шаблоне

...