【问题标题】:Django get random objects from databaseDjango 从数据库中获取随机对象
【发布时间】:2020-06-10 11:28:27
【问题描述】:

我有一个包含一百万多列的数据库,我想从该数据库中返回 100 个随机对象。

在网上搜索解决方案后,我看到关于 order_by['?'] 方法及其替代方案的争论很大(甚至在 Django 官方文档中!),此外,关于这个问题的大多数讨论都是从 2010 年开始的+-。

所以,我想知道从我的 Djando 模型生成随机对象的最佳做法是什么。 我在 Django 文档中看到它可能基于数据库本身,那么它是 MySQL 还是 PostgreSQL 或其他东西有关系吗?或者它是否取决于后端本身(AWS RDS 或其竞争对手)

这是我的模型:

class BasicPost(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    published = models.BooleanField(default=False)
    created_date = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=False)
    body = models.TextField(max_length=999)
    media = models.ImageField(blank=True)

    def get_absolute_url(self):
        return reverse('basic_post', args=[str(self.pk)])

    def __str__(self):
        return self.title

谢谢!

【问题讨论】:

    标签: django django-models django-rest-framework django-queryset


    【解决方案1】:

    你可以直接按照order_by['?']的方式点赞

    BasicPost.objects.order_by("?")[:100]
    

    注意:- 但是order_by('?') 查询可能会很昂贵且速度很慢,具体取决于数据库。


    更好的方法: django-random-queryset

    第 1 步: 将 RandomManager 添加到所需模型:

    from django.db import models
    
    from django_random_queryset import RandomManager
    
    class BasicPost(models.Model):
        objects = RandomManager()
        author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
        # ...
    
    

    第 2 步:使用它

    queryset = BasicPost.objects.all()
    queryset.random()   # get one random record
    queryset.random(100)  # get 100 random records
    

    【讨论】:

    • 它是一个已知的包吗?它适用于大型数据库和规模吗?我没有找到太多关于它的内容
    • 没有找到任何性能比较:是否值得“成本”? (几行代码,不会花那么多钱……)
    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2017-07-06
    • 2014-06-30
    相关资源
    最近更新 更多