Django 过滤器__保留顺序

问题描述 投票:0回答:1

这个问题是关于 Django 过滤,带有

__In
子句。基本上,我试图了解如何通过提供
videos.filter(video__in = video_ids)
和字符串 id 来进行过滤,以便返回的每一行的顺序与用于过滤的列表中字符串 id 的顺序相同。

对于更多上下文,可以使用字符串 id 进行过滤,例如

['7C2z4GqqS5E','kTlv5_Bs8aw','OK3GJ0WIQ8s','p8npDG2ulKQ','6ZfuNTqbHE8']
。 Model
video
字段是上面描述的视频id。它与整数 id 不同。

下面使用的

video_id_order
是我尝试过的,它给出了错误
Field 'id' expected a number but got '7C2z4GqqS5E'
,我相信这没有被正确使用,并且仍然缺少一些东西来保留结果的顺序,因为它是在
video_ids
中。在这种情况下,正确的顺序函数应该是什么,或者这种方法对于 Django 模型来说是否正确,以在使用
__In
子句时保留查询集结果?

def get_video_objects(video_ids,count):
    '''
    video_ids are already in the correct order, filter should return rows in the same order
    '''
    videos = Video.objects.all()
    // video_id_order = Case(*[When(id=id, then=pos) for pos,id in enumerate(video_ids)])
    results = videos.filter(video__in = video_ids)
    // results = results.order_by(video_id_order)
    results = list(results[:int(count)]\
    .values('video','title','comment_count','likes'))
    return results

视频模型如下

class Video(models.Model):
    id = models.PositiveBigIntegerField(primary_key=True,serialize=False,auto_created=False)
    video = models.SlugField(unique=True,null=False,primary_key=False)
    title = models.CharField(max_length=200)
    comment_count = models.PositiveIntegerField(default=0)
    likes = models.PositiveIntegerField(default=0)
python django database data-structures
1个回答
0
投票

使用 id__in,而不是 video__in。并且 video_ids 必须是列表。

# results = videos.filter(video__in=video_ids)
results = videos.filter(id__in=video_ids)
© www.soinside.com 2019 - 2024. All rights reserved.