Django Показать различающиеся значения в списке
Я пытаюсь создать таблицу, которая показывает только уникальные значения на основе определенного столбца. Следующий код не содержит никаких ошибок, но не показывает уникальные значения, как предполагалось - есть идеи, где ошибка?
Почему это не поможет? return self.name.distinct('name')
Пример, у меня есть 3 строки для Роба в моей таблице, потому что у него 3 адреса, но я создаю список в моем приложении, который показывает Роба, Джона и Клейтона, и я хочу, чтобы Роб отображался только один раз.
views.py
from django.http import HttpResponse
from django.views.generic import TemplateView,ListView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Book
class BookList(ListView):
model = Book
class BookCreate(CreateView):
model = Book
fields = ['name', 'address', 'birthdate', 'deathdate', 'description']
success_url = reverse_lazy('books_cbv:book_list')
class BookUpdate(UpdateView):
model = Book
fields = ['name', 'address', 'birthdate', 'deathdate', 'description']
success_url = reverse_lazy('books_cbv:book_list')
class BookDelete(DeleteView):
model = Book
success_url = reverse_lazy('books_cbv:book_list')
models.py
from django.db import models
from django.urls import reverse
class Book(models.Model):
name = models.CharField(max_length=200)
address = models.CharField(max_length=200, default='none')
birthdate = models.CharField(max_length=200, default='none')
deathdate = models.CharField(max_length=200, default='none')
description = models.CharField(max_length=1000, default='none')
def __str__(self):
return self.name.distinct('name')
def get_absolute_url(self):
return reverse('books_cbv:book_edit', kwargs={'pk': self.pk})
book_list.html
{% extends "base.html" %}
{% block content %}
<h2><a href="{% url 'books_cbv:book_list' %}">Home</a>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</h2>
<ul style="position: absolute; top:50%; left:50%; list-style-type: none">
{% for book in object_list %}
<li style="margin-bottom: 25px;">
<div class="card" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">{{ book.name }}</h5>
<h6 class="card-subtitle mb-2 text-muted">{{ book.address }}</h6>
<!-- add a new {{ photos.image }} for statement here to add horizontal gallery -->
<p class="card-text">{{ book.description }}</p>
<a href="{% url 'books_cbv:book_edit' book.id %}">Edit</a>
<a href="{% url 'books_cbv:book_delete' book.id %}">Delete</a>
</div>
</div>
</li>
{% endfor %}
</ul>
<a href="{% url 'books_cbv:book_new' %}">New</a>
{% endblock %}
По сути, ваш класс BookList должен выглядеть так, как упомянул @bdbd:
class BookList(ListView):
model = Book
def get_queryset(self):
books = Book.objects.distinct('name')
return books
В вашем случае вам просто нужно использовать distinct. Если у вас сложный запрос, вы можете переопределить метод get_queryset, как предложил @bdbd
class BookList(ListView):
model = Book.objects.distinct('name')