我只想每次从数据库中查询 3 个随机产品 3

I want to query 3 Random Products from the Database everytime only 3

y = (Product.objects.all()).count()
    x = random.randint(3,y)
    prouct1 = Product.objects.get(id = x+1)
    prouct2 = Product.objects.get(id = x-1)
    prouct3 = Product.objects.get(id = x-2)

我想在每次 运行 一个函数时获得 3 个随机产品 最初我使用上面的方法但是问题是如果我删除一个对象然后我得到错误我不希望那件事发生显然我可以 运行 更多检查,但我觉得有一些简单的方法可以做到 objective 是每次呈现页面时从数据库中获取随机对象

改为使用 OFFSET … LIMIT …

qs = Product.objects.all()
n = qs.count()
x0, x1, x2 = random.sample(range(n), 3)
product0 = qs[x0]
product1 = qs[x1]
product2 = qs[x2]

这要求 Product table 中至少有三项,并且会进行 次查询:一项用于计数,三项用于个别产品。也将保证三种产品是截然不同的。

如果table不是那么大,您可以从主键列表中采样,然后获取三个项目:

pks = Product.objects.values_list('pk', flat=True)
product0, product1, product2 = Product.objects.filter(pk__in=random.sample(pks, 3))

这将进行两个查询:一个用于加载所有主键,另一个用于批量获取三个产品。如果您要获取的产品数量增加,这将更具可扩展性,因为例如获取十个产品,仍然需要两个查询。

只需使用 .order_by('?'):

即可获取随机产品
ran_prod = Product.objects.all().order_by('?')[:3]

注:

order_by('?') queries may be expensive and slow, depending on the database backend you’re using.