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