我在 Django 中有一个查询集:
Books.objects.filter(name=variable)
我想在我的用户中随机显示此列表(两个不同的用户不会以相同的顺序查看书籍)。但是,如果他多次回来,我希望同一用户的订单保持不变。
那么有没有一种方法,给定一个特定于我的用户的整数(比如说他的 user.id),来随机化查询集?
非常感谢 !
您可以在数据库上随机化它:
Books.objects.filter(name=variable).order_by('?')
但最好将列表存储在缓存中,然后随机化缓存列表。
出于开发目的,您可以在以下位置使用虚拟缓存settings.py
:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
在生产中,您应该使用受支持的缓存。
设置完成后,在用户登陆的第一个视图中,从数据库中获取项目并将它们存储在缓存中:
import random
from django.core.cache import cache
@login_required
def index(request):
cache_key = '{0}-books'.format(request.user.pk)
book_list = cache.get(cache_key)
if not book_list:
# There was nothing in the cache, so we fetch the items
# and add them in the cache
# Here we set it to expire after 3600 seconds (1 hour)
book_list = list(Book.objects.filter(name=variable))
random.shuffle(book_list)
cache.set(cache_key, book_list, 3600)
# the rest of your code
您可以创建一个单独的random.Random
对象:
from random import Random
r = Random()
r.seed(some_user_id)
books = Books.objects.filter(name=variable)
jumbled = sorted(books, key=lambda L: r.random())