/ / Remover duplicatas do queryset django - django, web, django-models

Remover duplicatas do queryset django - django, web, django-models

Eu fiz este queryset no meu banco de dados django:

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

Isso me retornou isso:

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

Agora eu quero deletar todos os objetos duplicadoscom o mesmo "material__id", exceto o primeiro (o mais recente). Tentei fazer isso primeiro, com .distinct, mas meu banco de dados é sqlite3 e isso me deu um erro.

Respostas:

0 para resposta № 1

Eu acho que você pode usar o .distinct() método queryset, passando o material como argumento, algo como:

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

0 para resposta № 2

Usando o .distinct("material_id") método queryset só funcionará em PostgreSQL (veja a documentação Aqui).

Se você realmente deve usar sqlite por algum motivo,você poderia fazer isso com uma consulta muito menos eficiente, primeiro obtendo os pks dos materiais desejados e, em seguida, filtrando por esses pks em sua consulta final.