2

我在 Django 中有一个查询集:

Books.objects.filter(name=variable)

我想在我的用户中随机显示此列表(两个不同的用户不会以相同的顺序查看书籍)。但是,如果他多次回来,我希望同一用户的订单保持不变。

那么有没有一种方法,给定一个特定于我的用户的整数(比如说他的 user.id),来随机化查询集?

非常感谢 !

4

2 回答 2

2

您可以在数据库上随机化它:

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
于 2013-09-14T19:51:45.290 回答
1

您可以创建一个单独的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())
于 2013-09-14T20:06:11.620 回答