Запросить определенное количество объектов Django - PullRequest
0 голосов
/ 26 апреля 2018

Я создаю веб-сайт, который позволяет пользователю следить за определенными акциями и просматривать статьи, связанные с тем, что они следуют. В 'index.html' я хотел бы показать только последние 5 Article s для каждого Stock, за которым следует пользователь.

Как это можно сделать?

models.py:

class Stock(models.Model):
        name = models.CharField(max_length = 50)
        ticker = models.CharField(max_length = 50)

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    followed_stocks = models.ManyToManyField(Stock, blank=True)

    @receiver(post_save, sender=User)
    def update_user_profile(sender, instance, created, **kwargs):
        if created:
            Profile.objects.create(user=instance)
        instance.profile.save()

class Article(models.Model):
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE, default = 0 )
    title = models.CharField(max_length = 200)
    url = models.URLField()
    description = models.TextField()

views.py:

def index(request):
    stocks_user_follows = list(request.user.profile.followed_stocks.all())
    articles_to_display = Article.objects.filter(stock__in = stocks_user_follows)

    return render(request, 'core/index.html', {'stocks_user_follows':stocks_user_follows, 'articles_to_display':articles_to_display})

index.html:

<div class="container">
    <div class="row">
        {% for stock in stocks_user_follows %}
            <div class="col-md-4">
                <div class="card">
                    <h2>{{ stock }}</h2>
                    <ul>
                        {% for article in articles_to_display %}
                            {% if article.stock == stock %}
                                <li><a  href="{{article.url}}">{{ article.title }}</a></li>
                            {% endif %}
                        {% endfor %}
                    </ul>
                    <a href="#" class="btn btn-light w-50 mx-auto mb-4">All {{ stock }} News</a>

                </div>
            </div>

forms.py:

class StockFollowForm(forms.Form):
    stocks = forms.ModelMultipleChoiceField(required =False,
                                           widget=forms.CheckboxSelectMultiple,
                                           queryset=Stock.objects.all(),
                                           label= "",
                                           )

1 Ответ

0 голосов
/ 26 апреля 2018

Я не могу определить, по каким критериям вы определяете, какие статьи являются «последними» или «первыми», но вам нужно будет изменить только одну строку кода:

def index(request):
    ...
    articles_to_display = Article.objects.filter(stock__in = stocks_user_follows)[:5]
    ...

Нарежьте наборы квестов , чтобы ограничить его максимум 5 экземплярами.

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

...