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')
Вернуться на верх