[Django][DRF] Как получить UNORDERED queryset с помощью .filter?

во-первых, я не владею ENG, поэтому будьте терпеливы к моим навыкам ENG или дайте мне несколько советов.

Я пишу API, создавая пост с помощью сериализатора drf. И я столкнулся с проблемой "порядка добавления тегов в пост".

  • модели постов и тегов связаны через поле M2M

То есть, допустим, я добавляю в пост теги a, b и c. Логика, которую я использую, следующая.

# class Serializer
# def create(instance):
# instance : specific post instance

tags = ['t', 'a', 'g', 's']
Tag.objects.bulk_create([Tag(name = tag) for tag in tags])
instance.add.tags(*[tag for tag in Tag.objects.filter(name__in = tags)])

запустите это сначала. теги добавляются в таком порядке

TagQuerySet[Tag<'t'>, Tag<'a'>, Tag<'g'>, Tag<'s'>]
<
tags = ['g', 'a', 's']

django добавляет в отсортированном порядке, а не в том, в котором я хочу, например,

# tags new created instance
TagQuerySet[Tag<'a'>, Tag<'g'>, Tag<'s'>]

Я знаю метод, который добавляет теги, следующие в порядке списка, используя цикл for loop

for tag in tags:
    instance.tags.add(Tag.objects.get(name=tag))

но это неэффективно.

Итак, мой вопрос таков

  • как получить набор запросов, используя .filter следуя порядку моего списка.
  • Если для этого нет способа. Какой эффективный способ добавления тегов к посту

Вы можете добавить еще один столбец в класс Tag, а именно приоритет, и всякий раз, когда вы вставляете строки, добавлять приоритет значения.

Затем вы можете упорядочить по приоритетам примерно так:

tags = [('t', 4), ('a', 2), ('g', 1), ('s', 3)]
Tag.objects.bulk_create([Tag(name = tag[0], priority=tag[1]) for tag in tags])

Tag.objects.all().order_by('priority')

также оптимизированная версия этого:

for tag in tags:
    instance.tags.add(Tag.objects.get(name=tag))

это:

tags_db = Tag.objects.filter(name__in=[tag for tag in tags])
instance.tags.set(list(tags_db))
Вернуться на верх