Этот вопрос касается фильтрации Django с предложением __In. По сути, я пытаюсь понять, как фильтровать, предоставляя videos.filter(video__in = video_ids) с идентификаторами строк, чтобы каждая возвращаемая строка имела тот же порядок, что и порядок идентификаторов строк в списке, используемом для фильтрация.
Для большего контекста фильтрация выполняется с использованием идентификаторов строк, например. ['7C2z4GqqS5E','kTlv5_Bs8aw','OK3GJ0WIQ8s','p8npDG2ulKQ','6ZfuNTqbHE8']. Поле Model video — это идентификатор видео, описанный выше. Он отличается от целочисленного идентификатора.
Использованный ниже video_id_order был тем, что я пробовал, и это дало ошибку. Поле «id» ожидало число, но получило «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)
Подробнее здесь: https://stackoverflow.com/questions/790 ... erve-order