【问题标题】:how to shuffle the data retrieved from the database如何打乱从数据库中检索到的数据
【发布时间】:2019-07-28 15:38:42
【问题描述】:

我有书籍模板,其中显示有关书籍的更多信息,如书名、价格和作者等。

在同一个模板中,我有类似的书籍部分,我想根据分类显示与特色书籍相似的书籍(两者具有相同的分类)

为了做到这一点,我正在考虑对我从数据库中检索到的书籍进行洗牌,而不是仅仅使用普通循环来使其更具动态性,因为每本书都有该分类,页面每次显示不同的书籍而不是相同的书籍

这是views.py中的代码

def book(request, book_id):
book = get_object_or_404(Book, pk=book_id)
similar_books = Book.objects.all()[:4]

book_context = {
    'book': book,
    'similar_books': similar_books
}
return render(request, 'books/book.html', book_context)

这是我模板中的代码

<div class="row">
            <div class="col py-5 text-center">
                <h3 class="mb-5">Similar books</h3>
                <div class="row d-flex justify-content-center">
                    {% for similar_book in similar_books %}
                        {% if similar_book.classification == book.classification and similar_book.id > book.id %}
                            <div class="col-md-3">
                                <a href="{% url 'book' similar_book.id %}"><img src="{{ similar_book.img.url }}"></a>
                                <a href="{% url 'book' similar_book.id %}"><p class="mt-2">{{ similar_book.title}}</p></a>
                                <p class="text-muted">{{ similar_book.author }}</p>
                                <p>{{ similar_book.price }}</p>
                            </div>
                        {% endif %}
                    {% endfor %}
                </div>
            </div>

我包含similar_book.id &gt; book.id 的原因是我不希望它在类似的书中显示特色书

我知道这不是最好的逻辑方法,就好像特色书是列表中的最后一本书一样,循环将停止

我也想过用

替换上面的 if 语句

{% for similar_book in similar_books[{{ similar_book.id }} -1:] %} 在精选书籍之后开始循环浏览书籍并添加 if 语句 {% if book.id == len(similar_books) %} then {% similar_book.id == 1 %}

但不确定逻辑是否正确,有什么想法吗?

【问题讨论】:

    标签: python django django-models django-templates django-views


    【解决方案1】:

    不要将逻辑放入模板中,例如,如果您不想显示正在推荐的图书,则可以将其从查询集中排除,如下所示:

    def book(request, book_id):
        book = get_object_or_404(Book, pk=book_id)
        similar_books = Book.objects.all().exclude(pk=book_id)[:4]
        ...
    

    您可以使用order_by('?') 以随机顺序获得结果,所以最终它看​​起来像:

    def book(request, book_id):
        book = get_object_or_404(Book, pk=book_id)
        similar_books = Book.objects.all().exclude(pk=book_id).order_by('?')[:4]
        ...
    

    请注意,order_by('?') 可能会很慢。您可以在此处阅读有关进行改组的不同方法: How to pull a random record using Django's ORM?

    【讨论】:

    • 我对 Django 很陌生,我不知道排除也不知道 order_by,但它确实有效!感谢您的帮助并向我添加新信息:)
    • 肯定的事情 :) 一般来说,django 有很多东西可以让你作为开发人员的生活变得轻松,至少在常见用例方面是这样。
    【解决方案2】:

    在Django中有很多类似的随机获取对象的帖子,比如this

    我建议按照你的观点去做:

    id_list = list(
        Book.objects.exclude(pk=book.pk).values_list('id', flat=True))
    
    n = 2
    rand_ids = random.sample(id_list, n)
    similar_books = Book.objects.filter(id__in=rand_ids)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 2021-10-26
      • 2013-10-31
      • 2016-11-27
      • 2016-03-17
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多