【问题标题】:Django extras() - Logic/algorithmDjango extras() - 逻辑/算法
【发布时间】:2014-06-30 17:37:42
【问题描述】:

我有一个看起来像这样的:

class Post(models.Model):
    user = models.ForeignKey(Profile, related_name='posts')

    created = models.DateTimeField(auto_now_add=True)
    description = models.CharField(max_length=100, null = True)

这有两个与之相关的模型:

class Comments(models.Model):
    user = models.ForeignKey(Profile, related_name='author')
    post = models.ForeignKey(Post, related_name='posts')


class Likes(models.Model):
    user = models.ForeignKey(Profile, related_name='liker')
    post = models.ForeignKey(Post, related_name='post' )
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('created',)

现在,逻辑基本上是计算喜欢的数量+随着时间的推移衰减的cmets数量:

likes + comments / now() - post.created

我已经创建了这个逻辑的 sql 版本,现在使用我创建的 django extra:

s = Post.objects.extras(select={'post':'logic here...... WHERE id = %d} % **MISSING PIECE THAT ALLOWS ME TO ITERATE OVER THE POST OBJECTS**)

谁能帮我弄清楚丢失的部分是什么?我尝试使用 Post.objects.all().id,它不起作用,因为它是一个查询集。

感谢任何帮助,cmets 了解更多信息

【问题讨论】:

    标签: python sql django algorithm django-rest-framework


    【解决方案1】:

    请允许我将相关名称更改为更有意义的名称

    class Post(models.Model):
        user = models.ForeignKey(Profile, related_name='posts')
    
    class Comments(models.Model):
        user = models.ForeignKey(Profile, related_name='comments')
        post = models.ForeignKey(Post, related_name='comments')
    
    class Likes(models.Model):
        user = models.ForeignKey(Profile, related_name='likes')
        post = models.ForeignKey(Post, related_name='likes' )
    

    现在你可以做

    post = Post.objects.get(pk=1)
    output = ( post.likes.all().count() + post.comments.all().count() ) / ( now() - post.created )
    

    更新

    class Post(models.Model):
        created_at = models.DateTimeField(auto_now_add=True)
    
        def output(self):
            return ( self.likes.all().count() + self.comments.all().count() ) / (datetime.datetime.now() - self.created_at).total_seconds()
    
    thelist = sorted(Post.objects.all(), key: lambda p : p.output)
    

    据我所知,您无法根据与数据库不直接相关的内容对列表进行排序。因此,根据需要获取信息,并在 Python 中对其进行排序。

    【讨论】:

    • 感谢您的回复。在这种情况下,我需要通过“输出”订购所有帖子,这就是为什么我只是尝试使用附加功能,因为“order_by”。你觉得我可以怎么做?这也适用于 django-rest 框架。
    • 病了!正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多