Как я могу отсортировать модель, которая содержит пользователя в качестве внешнего ключа, на страницу, которая показывает данные каждого пользователя? - PullRequest
0 голосов
/ 31 января 2019

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

on Models.py (simplified, not actual code):
class User(models.Model):
    name = models.CharField()
    level = models.IntegerField()

class History(models.Model):
    name = models.ForeignKey('User', on_delete = models.CASCADE)
    history = models.CharField()

on HTML:
{% for user in users %}
    <p>{{ user.name }}</p>
    {% for history in histories.objects.filter(name__exact=User.id) %}
        <p> {{ history }} </p>//sorted history that contains 'user' as ForeignKey
    {% endfor %}
    <p>{{ user.level }}</p>
{% endfor %}

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

Я сейчас использую последнюю версию Django, 2.1, и я уже пытался получить значение pk от 'user', иотправьте его на views.py, но это не помогло.

Expected: 
<p>User 01</p> //Name
<p>Changed name user01 to User 01</p>
<p>Level increased to 25</p>
<p>Level increased to 26</p>  //History
<p>LV 26</p> //Level

<p>User 02</p> //Name
<p>Level increased to 32</p>
<p>Changed name user02 to User 02</p>
<p>Level increased to 33</p>  //History
<p>LV 33</p> //Level

Actual:
<p>User 01</p>
<p></p>
<p>Lv 26</p>

<p>User 02</p>
<p></p>
<p>Lv 33</p>

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Если вам всегда нужен один и тот же порядок сортировки, вы можете добавить сортировку по умолчанию к классу History:

class History(models.Model):
    # define fields...
    class Meta:
        ordering = ['-id']

Преимущество состоит в том, что каждый History набор запросов будет отсортирован, как указано, без каких-либодальнейшие действия с вашей стороны.Недостатком является то, что набор запросов будет всегда сортироваться, что может повлиять на производительность.Поэтому, если он вам не всегда нужен, лучше либо определить метод, предложенный Кристианом, либо просто создать соответствующим образом упорядоченный набор запросов в представлении и передать его в шаблон (создавая отфильтрованные наборы запросов непосредственно в шаблоне, как показано в вашем коде).не будет работать, насколько я знаю):

for user in users:
    user.sorted_history = History.objects.filter(name = user).order_by('-id')
    # or .order_by('-timestamp'), .order_by('history') etc. as needed
0 голосов
/ 31 января 2019

Есть несколько способов сделать это.Одним из способов является расширение экземпляра Manager и добавление пользовательского метода, который возвращает записи, отсортированные по id.Например:

class HistoryManager(models.Manager):
    def latest_records(self):
        return super().get_queryset().order_by('-id')

class History(models.Model):
    name = models.ForeignKey('User', on_delete = models.CASCADE, related_name='histories')
    history = models.CharField()
    objects = HistoryManager()

{% for user in users %}
    <p>{{ user.name }}</p>
    {% for history in user.histories.latest_records %}
        <p> {{ history }} </p>//sorted history that contains 'user' as ForeignKey
    {% endfor %}
    <p>{{ user.level }}</p>
{% endfor %}

Еще один способ сделать это - создать метод в экземпляре модели User

class History(models.Model):
    name = models.ForeignKey('User', on_delete = models.CASCADE, related_name='histories')
    history = models.CharField()

class User(models.Model):
    name = models.CharField()
    level = models.IntegerField()
    def latest_history():
        return self.histories.order_by('-id')

{% for user in users %}
    <p>{{ user.name }}</p>
    {% for history in user.latest_history %}
        <p> {{ history }} </p>//sorted history that contains 'user' as ForeignKey
    {% endfor %}
    <p>{{ user.level }}</p>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...