2009-06-01 5 views
2

J'ai 2 modèles qui ressemblent à ce que:Quel est le meilleur moyen de récupérer/rendre des relations un-à-plusieurs?

class Entry(models.Model): 
user = models.ForeignKey(User) 
dataname = models.TextField() 
datadesc = models.TextField() 
timestamp = models.DateTimeField(auto_now=True) 

class EntryFile(models.Model): 
    entry = models.ForeignKey(Entry) 
    datafile = models.FileField(upload_to="uploads/%Y/%m/%d/%H-%M-%S") 

Je veux rendre toutes les entrées avec leurs fichiers associés à un utilisateur spécifique. Maintenant, je fais de cette façon, à mon avis pour obtenir les valeurs:

entries = Entry.objects.filter(user=request.user).order_by("-timestamp") 
    files = {} 
    for entry in entries: 
     entryfiles = EntryFile.objects.filter(entry=entry) 
     files[entry] = entryfiles 
    return render_to_response("index.html", {'user': request.user, 'entries': entries, 'files': files, 'message': message}) 

Mais je ne suis pas en mesure/ne sait pas comment travailler avec ces données dans mon modèle. Ce que je fais maintenant, mais ne fonctionne pas:

{% for entry in entries %} 
    <td>{{ entry.datadesc }}</td> 
    <td><table> 
     {{ files.entry }} 
     {% for file in files.entry %} 
     <td>{{ file.datafile.name|split:"/"|last }}</td> 
     <td>{{ file.datafile.size|filesizeformat }}</td> 
     <td><a href="{{ object.datafile.url }}">download</a></td> 
     <td><a href="{% url main.views.delete object.id %}">delete</a></td> 
     {% endfor %} 
    </table></td> 
{% endfor %} 

Tout le monde peut me dire si je fais la bonne façon en vue et comment accéder à ces données dans le modèle?

Merci!

Répondre

5

Il suffit de couper votre code en vue de cette ligne:

entries = Entry.objects.filter(user=request.user).order_by("-timestamp") 

Et faire cela dans le modèle:

{% for entry in entries %} 
    <td>{{ entry.datadesc }}</td> 
    <td><table> 
    {% for file in entry.entryfile_set.all %} 
     <td>{{ file.datafile.name|split:"/"|last }}</td> 
     <td>{{ file.datafile.size|filesizeformat }}</td> 
     <td><a href="{{ object.datafile.url }}">download</a></td> 
     <td><a href="{% url main.views.delete object.id %}">delete</a></td> 
    {% endfor %} 
    </table></td> 
{% endfor %} 

Je suis un grand fan de l'utilisation related_name dans les modèles, cependant, vous pouvez donc modifier cette ligne:

entry = models.ForeignKey(Entry) 

à ceci:

entry = models.ForeignKey(Entry, related_name='files') 

Et vous pouvez accéder à tous les fichiers pour une entrée particulière en changeant ceci:

{% for file in files.entryfile_set.all %} 

Pour plus lisible/évidente:

{% for file in entry.files.all %} 
+0

Il travaille maintenant grand. Je vous remercie! –

+0

Pas de problème. Bienvenue sur le site. –

+0

Merci pour les salutations :) –

Questions connexes