/ / Usuń duplikaty z zestawu zapytań django - django, web, django-models

Usuń duplikaty z zestawu zapytań django - django, web, django-models

Zrobiłem ten zestaw zapytań do mojej bazy danych django:

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

To zwróciło mi to:

<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)}]>

Teraz chcę usunąć wszystkie zduplikowane obiektyz tym samym „materialnym identyfikatorem”, z wyjątkiem pierwszego (najnowszego). Próbowałem to zrobić najpierw z .distinct, ale moja baza danych to sqlite3 i to daje mi błąd.

Odpowiedzi:

0 dla odpowiedzi № 1

Myślę, że możesz użyć .distinct() metoda queryset, przekazując material jako argument, coś w stylu:

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

0 dla odpowiedzi nr 2

Używając .distinct("material_id") Metoda queryset działa tylko na PostgreSQL (patrz dokumentacja tutaj).

Jeśli z jakiegoś powodu naprawdę musisz użyć narzędzia sqlite,możesz to zrobić za pomocą znacznie mniej wydajnego zapytania, najpierw pobierając pks materiałów, które chcesz, a następnie filtrując je pod kątem ostatecznego zapytania.