Как убедиться, что этот заказ сохранен

#python #django #list #dictionary

Вопрос:

Я хочу знать, как лучше всего убедиться, что этот порядок сохранен, я думаю, что лучше всего будет применить функцию, которая работает с этим на лету, в то время как sqlite сохраняет порядок, postgres не переупорядочивает его, когда он сохраняется в базе данных,

 list_of_dicts = [[{'id': '3', 'text': ' Perpetual ', 'score': 3}, {'id': '2', 'text': ' Peter Parker ', 'score': 2}, {'id': '1', 'text': ' Miles .T Morales ', 'score': 1}], [{'id': '3', 'text': 'Perpetual ', 'score': 3}, {'id': '1', 'text': 'Miles .T Morales ', 'score': 2}, {'id': '2', 'text': 'Peter Parker ', 'score': 1}], [{'id': '1', 'text': 'Miles .T Morales ', 'score': 3}, {'id': '3', 'text': 'Perpetual ', 'score': 2}, {'id': '2', 'text': 'Peter Parker ', 'score': 1}], [{'id': '3', 'text': ' Perpetual ', 'score': 3}, {'id': '2', 'text': ' Peter Parker ', 'score': 2}, {'id': '1', 'text': ' Miles .T Morales ', 'score': 1}], [{'id': '1', 'text': ' Miles .T Morales ', 'score': 3}, {'id': '2', 'text': ' Peter Parker ', 'score': 2}, {'id': '3', 'text': ' Perpetual ', 'score': 1}], [{'id': '2', 'text': ' Peter Parker ', 'score': 3}, {'id': '3', 'text': ' Perpetual ', 'score': 2}, {'id': '1', 'text': ' Miles .T Morales ', 'score': 1}]]
 

Я хочу отсортировать список от наивысшего балла до наименьшего, но без зависимости от базы данных,

Редактировать

Я использую модели django.JSONField для хранения данных. добавление queryset.order_by («данные__оценка») не влияет на него, когда я вытаскиваю его в свой вид. то же самое и с моделями.Атрибут мета-упорядочения

 .....
class Meta:
    ordering = ("data__score",)
 

не имеет никакого эффекта, я думаю, что это связано с базой данных, теперь я просто хочу знать, как сортировать это с помощью python вместо того, чтобы полагаться на несоответствие базы данных/ORM.

ПРАВКА 2

Моя модель:

 class Ballot(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    election = models.ForeignKey(
        Election, related_name="ballots", on_delete=models.CASCADE
    )
    data = models.JSONField(null=True)
    cast_date = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
 

Комментарии:

1. Лучший способ-изменить свой запрос при чтении данных из базы данных, чтобы результаты были отсортированы по баллам. Не имеет значения, в каком порядке вы хранили данные

2. Наборы запросов имеют order_by метод. Если вы не укажете порядок, данные будут возвращены в произвольном порядке из любой реляционной базы данных, и этот порядок может быть или не быть нужным вам.

3. Я упустил из своего вопроса кое-что важное. он использует JSONField django()

4. Это может быть полезно

5. Это не упорядочивает qs. @Рустамгараев

Ответ №1:

Я смог решить этот вопрос с помощью атрибута сортировки и функции python.

 model_ballot = ModelBallot.objects.filter(
    election__id__exact=election_id
).values_list("data", flat=True)

new_model_ballot = []
ballots = list()
for b in model_ballot:
    newlist = sorted(b, key=lambda k: k['score'], reverse=True)
    new_model_ballot.append(newlist)
 

Комментарии:

1. Хотя этот ответ дает правильный результат, он невероятно неэффективен. Вы должны узнать о order_by() методе, который будет выполнять сортировку на уровне базы данных.

2. Я также предлагаю вам взглянуть на разницу, когда вы обходитесь просто filter() без values_list() . Это позволит вам использовать объекты модели напрямую, а не словари, что часто может привести к более чистому коду, поскольку вы можете делать ballot.score это, а не ballot["score"] .

3. data является полем json, order_by не работает на нем,