从Django MySQL查询中获取随机记录的最佳方法

时间:2016-05-08 12:21:46

标签: mysql django

我有一个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的记录。还有更好的方法吗?

0 个答案:

没有答案