Каков наилучший способ получить / отобразить отношения один-ко-многим? - PullRequest
2 голосов
/ 01 июня 2009

У меня есть 2 модели, которые выглядят так:

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")

Я хочу отобразить все записи с соответствующими файлами для конкретного пользователя. Теперь я делаю это так, на мой взгляд, чтобы получить значения:

    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})

Но я не могу / не знаю, как работать с этими данными в моем шаблоне. Это то, что я делаю сейчас, но не работает:

{% 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 %}

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

Спасибо!

1 Ответ

5 голосов
/ 01 июня 2009

Просто обрежьте код вашего вида до этой строки:

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

И сделать это в шаблоне:

{% 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 %}

Я большой поклонник использования related_name в моделях, поэтому вы можете изменить эту строку:

entry = models.ForeignKey(Entry)

К этому:

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

И затем вы можете получить доступ ко всем файлам для определенной записи, изменив это:

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

Для более читабельного / очевидного:

{% for file in entry.files.all %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...