Удалить дубликаты из набора запросов Django - PullRequest
0 голосов
/ 16 мая 2018

Я сделал этот набор запросов для моей базы данных django:

 material_purchase=Material_Purchase.objects.order_by("material__id","-purchase__date").values("id","material__id","price","purchase__date")

Это вернуло мне это:

<QuerySet [{'id': 8, 'material__id': 1, 'price': Decimal('6.00'), 'purchase__date': datetime.date(2018, 5, 31)}, {'id': 2, 'material__id': 1, 'price': Decimal('5.00'), 'purchase__date': datetime.date(2018, 4, 29)}, {'id': 9, 'material__id': 1, 'price': Decimal('3.00'), 'purchase__date': datetime.date(2017, 12, 1)}, {'id': 7, 'material__id': 2, 'price': Decimal('10.00'), 'purchase__date': datetime.date(2018, 5, 31)}, {'id': 5, 'material__id': 2, 'price': Decimal('20.00'), 'purchase__date': datetime.date(2018, 5, 16)}, {'id': 1, 'material__id': 2, 'price': Decimal('27.00'), 'purchase__date': datetime.date(2018, 4, 29)}, {'id': 10, 'material__id': 2, 'price': Decimal('5.00'), 'purchase__date': datetime.date(2017, 12, 1)}, {'id': 6, 'material__id': 3, 'price': Decimal('6.00'), 'purchase__date': datetime.date(2018, 5, 31)}, {'id': 11, 'material__id': 3, 'price': Decimal('5.00'), 'purchase__date': datetime.date(2017, 12, 1)}]>

Теперь я хочу удалить все дубликаты объектов с одинаковым «material__id», кроме первого (самого последнего). Сначала я попытался сделать это с помощью .distinct, но моя база данных - sqlite3, и это выдает ошибку.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Использование метода набора запросов .distinct("material_id") будет работать только на PostgreSQL (см. Документы здесь ).

Если вам действительно необходимо использовать sqlite по какой-либо причине, вы можете сделать это с помощьюгораздо менее эффективный запрос, сначала получая pks необходимых материалов, а затем фильтруя эти pks в вашем последнем запросе.

0 голосов
/ 16 мая 2018

Я думаю, вы можете использовать метод набора запросов .distinct(), передав в качестве аргумента material, что-то вроде:

Material_Purchase.objects.order_by("material__id","-purchase__date").values("id","material__id","price","purchase__date").distinct('material__id')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...