我有一个Django MySQL表,其中包含已提交给我的服务器的项目列表。该表目前非常小(低100)但我预计它最终会达到几十万。
我希望我的数据库查询从此表返回一组随机的30个结果。
我的桌子型号是:
class Item(models.Model):
ITEM_TYPES = (
('V', 'Vine'),
('Y', 'YouTube'),
('P', 'Photo'), # Photo is stored by us on a CDN somewhere
('F', 'Flickr'),
('I', 'Instagram'),
('D', 'DeviantArt'),
('5', '500px'),
)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=60, default='')
url = models.CharField(max_length=250, default='', unique=True)
item_type = models.CharField(max_length=1, choices=ITEM_TYPES)
keywords = models.ManyToManyField(Keyword, related_name='keywords')
credits_applied = models.IntegerField(default=5000)
credits_left = models.IntegerField(default=10)
credits_gifted = models.IntegerField(default=0)
date_added = models.DateTimeField(auto_now_add=True)
liked = models.IntegerField(default=0)
disliked = models.IntegerField(default=0)
active = models.BooleanField(default=True)
comment = models.CharField(max_length=100, blank=True)
approved = models.BooleanField(default=0)
我的查询目前看起来像这样:
Item.objects.filter(item_type='P', active=True, keywords__name__in=item_categories)[30]
我知道我可以在查询中使用order_by('?')
随机化结果,但这显然是一种非常低效且耗时的方法来为大型表执行此操作。
我已经广泛搜索了一个解决方案但未能找到解决方案。我想这会是很多人想做的事情吗?
我在Stackoverflow中找到的最接近的解决方案是:
In Django, how do I select 100 random records from the database?
但接受的答案是'?'对于大型桌子来说非常非常糟糕的选项。另一个答案仅适用于您进行一次或几次随机查询的情况。我需要每天做1000次随机查询。
我能想到的唯一解决方案是执行查询以返回满足查询条件的ID列表,然后从该列表中随机选择30个ID,然后执行另一个查询以返回这些ID的记录。还有更好的方法吗?