【问题标题】:DRF: How to find the model instance with the highest combined value of two fields?DRF:如何找到两个字段组合值最高的模型实例?
【发布时间】:2021-04-07 15:43:08
【问题描述】:

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

class Posts(models.Model):
    title = models.CharField(max_length=100)
    creation_timestamp = models.DateTimeField(auto_now_add=True)
    body = models.CharField(max_length=255)
    user_id = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 
    likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="likes",blank=True)
    dislikes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="dislikes",blank=True)

我在urls.py中添加了一个endpoint,这样当访问url.../v1/posts/max-interaction-count时,就会运行views.py中的如下函数:

@api_view(['GET'])
def interaction_count_view(request):
    max_post = None
    max_interactions = 0
    for post in Posts.objects.all():
        interactions = post.likes.count() + post.dislikes.count()
        if interactions > max_interactions:
            max_post = post
            max_interactions = interactions
    return Response({"Post number " :  max_post.pk, "interaction_count ": max_post.likes.count() + max_post.dislikes.count()})

这可行,返回帖子的 id 与最大喜欢和不喜欢的总和。但是,我相信interaction_count_view 可能不是很有可扩展性,因为它是用 python 编写的,而不是使用使用 SQL 的内置 django 方法。是这样吗?如果是这样,有什么更好的方法来计算与帖子实例相关的喜欢和不喜欢的数量?

【问题讨论】:

标签: python django django-models django-rest-framework django-views


【解决方案1】:

在查询集上注释计算帖子互动次数的表达式,并使用latest获取互动次数最多的帖子:

from django.db.models import Count

@api_view(['GET'])
def interaction_count_view(request):
    max_post = Posts.objects.annotate(interactions=Count('likes') + Count('dislikes')).latest('interactions')
    if max_post:
        return Response({"Post number" :  max_post.pk, "interaction_count": max_post.interactions})
    return Response({"Post number": None, "interaction_count": 0, "message": "No posts exist!"})

注意:我更改了您传递给响应的字典中的键,它们有多余的空格("Post number " 更改为 => "Post number" 等)

注意:模型名称最好是单数,所以Post而不是Posts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多