Member 14844261 Ответов: 0

Используйте значение F для индексации jsonfield в django


Эй ребята,

Я разрабатываю веб-сайт Django, и у меня есть следующие модели (упрощенные):

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    opinions = JSONField(default=default_opinions)

class Author(models.Model):
    name = models.CharField(max_length=50, unique=True)

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE, default='0')


при этом поле мнений - это мнение конкретного пользователя о разных авторах.
Например:

{
   Shakespeare: 0.5,
   Voltaire: 0.6
}


Затем у меня есть listView BookListView, в котором я хочу запросить базу данных книг и упорядочить их по мнению текущего вошедшего пользователя об их авторе. В предыдущем примере это были бы сначала все книги Вольтера, а затем книги Шекспира.

Поэтому я придумал это в своем listView:

def get_queryset(self):
    user_opinions = self.request.user.profile.opinions
    queryset = Book.objects.order_by(user_opinions[F("author__name")])
    return queryset


Проблема в том, что значение F вычисляется после get_queryset (), поэтому я получаю F("author__name") ключ не существует ошибка.

Я думал о том, чтобы перебирать ключи и значения dict, но я не вижу, как это может работать, поскольку мнения являются плавающими (и, следовательно, могут принимать любые значения).

Заранее спасибо ^^

Что я уже пробовал:

В дополнение к тому, что выше, я попробовал использовать
KeyTextTransform
но я не мог решить свою проблему таким образом.

0 Ответов