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有很多东西可以让您作为开发人员的生活变得轻松,至少在涉及常见用例时是这样。