Glitchmorphosis
@Glitchmorphosis

Как сделать фильтр по списку из ManyToMany?

Есть модель с полем ManyToMany. Из POST запроса получаю список pk записей которые к ManyToMany привязываются. Именно pk объекта, который к ManyToMany привязан. Мне нужно получить только те записи которые нашлись в этой модели.
Так их ищу:
json_request = json.loads(request.body)
exists_list = json_request['addId']
exists_list.append(json_request['mainId'])
print(exists_list)
try:
    exists_result = LinkedData.objects.filter(many__in=exists_list)
    print(exists_result) >>> 5, 823, 186, 585        
    return HttpResponse(exists_result)
except LinkedData.DoesNotExist:
    return HttpResponse('ok')

В записи ManyToMany такие pk:
5, 823, 186, 585
В exists_list:
[83, 663, 853, 5]
exists_result содержит следующие записи:
5, 823, 186, 585

То-есть он берет не только те объекты, которые есть в exists_list (тело POST запроса). Пока придумал перебирать QuerySet и искать совпадения с exists_list, и то чего нет в exists_list удалять из QuerySet. Может есть мение костыльный способ сделать все как нужно?

Модели:
class LinkedData(models.Model):
    many = models.ManyToManyField(
        ObjectDataFull,
        related_name='many_related',
        verbose_name='Много'
    )

    class Meta:
        db_table = 'build_analyzer_linked_data'

    def __str__(self):
        return u', '.join([str(a.pk) for a in self.many.all()])


class LinkedInfo(models.Model):
    linked_data = models.ForeignKey(
        LinkedData,
        on_delete=models.CASCADE,
        related_name='linked_data_related'
    )
    full = models.ForeignKey(
        ObjectDataFull,
        on_delete=models.CASCADE,
        related_name='unsorted_related'
    )

    main = models.BooleanField(
        default=False,
        null=False,
    )

    class Meta:
        db_table = 'build_analyzer_linked_info'


И можно ли как-то это в одну строку объединить:
exists_list = json_request['addId']
exists_list.append(json_request['mainId'])

? Когда так делаю:
exists_list = json_request['addId'].append(json_request['mainId'])

получаю exists_list is None >>> True

JSON выглядит так:
{
    "mainId": 5,
    "addId": [83, 663, 853]
}
  • Вопрос задан
  • 275 просмотров
Решения вопроса 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Это базовый функционал Django и в первом сниппете Вы им совершенно корректно пользуетесь. Непонятно, почему фильтрация не происходит, без приведения моделей и релевантного состояния БД.

Возможные причины:

  1. ManyToMany.through-модель сделана вручную и в ней нет уникального составного индекса на 2 внешних ключа
  2. Во всех четырех объектах реально есть хотя бы один из фильтруемых ID
  3. Вы привели далеко не весь код, описывающий проблему

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы