Python 如何洗牌从数据库检索的数据

Python 如何洗牌从数据库检索的数据,python,django,django-models,django-templates,django-views,Python,Django,Django Models,Django Templates,Django Views,我有一本书的模板,可以显示更多关于这本书的信息,如书名、价格和作者等 在同一模板中,我有相似的书籍部分,我想根据分类显示与特色书籍相似的书籍(两者都有相同的分类) 为了做到这一点,我正在考虑对从数据库中检索到的书籍进行洗牌,而不是仅仅使用普通循环使其更具动态性,因为每本书都有这样的分类,页面每次都显示不同的书籍,而不是相同的书籍 下面是views.py中的代码 def book(request, book_id): book = get_object_or_404(Book, pk=book_i

我有一本书的模板,可以显示更多关于这本书的信息,如书名、价格和作者等

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

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

下面是
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>

类似书籍
{相似书籍中相似书籍的百分比%}
{%如果相似的\u book.classification==book.classification和相似的\u book.id>book.id%}

{{similor\u book.author}

{{相似的图书价格}

{%endif%} {%endfor%}
我之所以包括
similous\u book.id>book.id
,是因为我不希望它在类似的图书中显示特色图书

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

我还考虑将上面的if语句替换为

{%for similous_books中的similous_books[{{similous_book.id}-1:]%}
开始在特色图书后面的图书中循环,并添加if语句
{%if book.id==len(similous_books)%}
然后
{%similouse_book.id==1%}


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

在Django中有很多类似的帖子可以随机获取对象,例如

在你看来,我建议你做些令人窒息的事:

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)

不要将逻辑放入模板中,例如,如果不想显示正在展示的图书,可以将其从queryset中排除,如下所示:

def book(request, book_id):
    book = get_object_or_404(Book, pk=book_id)
    similar_books = Book.objects.all().exclude(pk=book_id)[:4]
    ...
您可以使用(“?”)
按随机顺序获得结果,因此最终结果如下所示:

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('?')
可能会很慢。您可以在此处了解执行洗牌的不同方法:

我是Django的新手,我不知道如何排除或订购,但它起了作用!感谢您的帮助并为我添加了新信息:)当然:)一般来说,django有很多东西可以让您作为开发人员的生活变得轻松,至少在涉及常见用例时是这样。