Django фильтрует queryset и получает уникальные элементы

Я использую Django и SqLite.

У меня есть такая модель таблицы:

class TestPROD(models.Model):
    prodID    = models.CharField(max_length=15)
    ProdDate  = models.CharField(max_length=15)
    Price1    = models.DecimalField(max_digits=10, decimal_places=3,default=0)
    Price2    = models.DecimalField(max_digits=10, decimal_places=3,default=0)
    post_date = models.DateTimeField(default=timezone.now)
    author    = models.ForeignKey(User,on_delete=models.CASCADE)
    def __str__(self):
        return self.prodID
    def get_Total(self):
        TotPRC =self.Price1 +self.Price2
        return round(TotPRC, 2) 
    def get_absolute_url(self):
        return reverse('Custom', args=[self.prodID])
    class Meta:
        ordering = ('-TestDate',)

В моей базе данных есть много строк, которые содержат дублирующиеся элементы, например prodID HP или Lenovo имеют 1000 или более строк.

мой вопрос в том, как отфильтровать данные и дать мне только последний ProdDate продукта HP и таким образом последний элемент для Lenovo и один.

В моем файле views.py я пробовал много решений, но не получил хороших результатов

def welltests(request):
        testprodms = TestPROD.objects.annotate(latest_test_date=('prodID')).order_by('-ProdDate').distinct()
        return render(request, 'Home/AllProd.html', {'testprodms': testprodms})

это даст мне все данные (50000 строк), но организованные по продуктам.

уникальных prodID в моей базе данных около 600. поэтому мне нужно 600 строк различных продуктов с последним ProdDate

Тогда я попробовал это и многое другое, но ничего не получилось;

def welltests(request):
    testprodms = TestPROD.objects.order_by().values_list('prodID', flat=True).distinct()
    return render(request, 'Home/AllProd.html', {'testprodms': testprodms})

это дает мне количество моих продуктов, но без каких-либо других данных на моей HTML-странице

Вы можете использовать метод distinct() и метод latest() для фильтрации данных и возврата только последней ProdDate продукта HP и последней позиции для Lenovo.

Сначала используйте метод distinct() для удаления дублирующихся строк на основе поля prodID:

TestPROD.objects.distinct('prodID')

Затем используйте метод latest(), чтобы вернуть последнюю дату ProdDate для каждого prodID:

TestPROD.objects.distinct('prodID').latest('ProdDate')

Вы также можете использовать метод filter для фильтрации данных и получить последний элемент для конкретного продукта, например, для HP:

TestPROD.objects.filter(prodID='HP').latest('ProdDate')

Вы можете соединить в цепочку фильтр и latest, чтобы получить желаемый результат.

Это вернет набор запросов, содержащий последнюю дату ProdDate для каждого отдельного prodID.

После того, как я попробовал много решений, которые я хочу получить решение в одной строке, но я не смог получить. извините, поэтому я решил это, используя 3 строки.

def welltests(request):
    testprodms = TestPROD.objects.order_by().values_list('prodID', flat=True).distinct()
    AllProdcts = TestPROD.objects.all()
    listtests  =  [AllProdcts.filter(prodID__exact=prodtest).first() for prodtest in testprodms]
    return render(request, 'Home/AllProd.html', {'testprodms': listtests})
Вернуться на верх