Возвращение отличительного порядка на основе запроса In Query

У меня есть queryset, где я хочу вернуть соответствующий порядок на основе моих значений внутри фильтра in. Ниже приведены мои синтаксис и модели

Модели

class Transaction(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
    comments = models.TextField(null=True, blank=True)


class Profile(models.Model):
    user = models.OneToOneField(User,
                                null=True,
                                blank=True,
                                related_name='profile',
                                on_delete=models.SET_NULL)
    first_name = models.CharField(max_length=125, null=True, blank=True)
    middle_name = models.CharField(max_length=125, null=True, blank=True)
    last_name = models.CharField(max_length=125, null=True, blank=True)
    nickname = models.CharField(max_length=100, null=True, blank=True)
    balance = models.DecimalField(default=0.0, max_digits=7, decimal_places=2)
    is_online = models.BooleanField(default=False)

Синтаксис

from trading.models import Transaction
ids = [4, 1, 3, 2]
tx = Transaction.objects.filter(user_id__in=ids).order_by('user').distinct('user')

Где я ожидаю, что возвращаемый порядок объекта Transaction основан на порядке id в списке id

У меня была такая же проблема, вот как я ее решил. Это будет работать, если вы используете Django >= 1.8

from django.db.models import Case, When
from trading.models import Transaction
ids = [4, 1, 3, 2]
myorder = Case(*[When(user_id=id, then=pos) for pos, id in enumerate(ids)])
txt = Transaction.objects.filter(user_id__in=ids).order_by(myorder)

Выше уже есть хороший ответ, но я все же хочу поделиться своим ответом, и я сделал это на уровне приложения Python. Ответ выше выглядит лучше. Обратите внимание, что это работает с Django Rest Framework

ids = [4, 2, 3, 1]
transactions = Transaction.objects.filter(user_id__in=ids).order_by('user').distinct('user')
reorder_basis = {transaction.user_id: transaction for transaction in transactions}
reordered_transactions = [reorder_basis.get(_id) for _id in ids]
Вернуться на верх