[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))