如何重新整理从数据库中检索到的数据

时间:2019-03-06 21:07:01

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

我有图书模板,可显示有关图书的更多信息,例如书名,价格和作者等。

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

为此,我考虑的是从数据库中检索书籍,而不是仅仅使用常规循环使之更具动态性,因为每本书都有该分类,该页面每次都显示不同的书籍,而不是同一本书< / p>

这是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 > book.id是因为我不希望它在同类书籍中展示这本精选书

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

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

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

但是不确定逻辑是否正确,有什么主意吗?

2 个答案:

答案 0 :(得分:0)

有很多类似的文章可以随机获取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)

答案 1 :(得分:0)

不要在模板中添加逻辑,例如,如果您不想显示正在展示的书,则可以将其从查询集中排除,例如:

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?