/ / Премахване на дубликати от queryset django - django, web, django-модели

Премахнете дубликатите от queryset django - django, уеб, django модели

Направих този набор от заявки към моята база данни на 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 и това ми дава грешка.

Отговори:

0 за отговор № 1

Мисля, че можете да използвате .distinct() метод на запитване, преминавайки на material като аргумент, нещо като:

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

0 за отговор № 2

Използвайки .distinct("material_id") методът на запитване ще работи само на PostgreSQL (вижте документите тук).

Ако наистина трябва да използвате sqlite по някаква причина,бихте могли да постигнете това с много по-неефективна заявка, първо да получите pks от материалите, които искате, и след това да филтрирате за тези pks във вашата последна заявка.