Django + Postgres + UUID

Я пытался добавить поле UUID в мою модель, чтобы использовать его в URL, но я продолжаю получать эту ошибку

django.db.utils.ProgrammingError: столбец "id" имеет тип bigint, но выражение имеет тип uuid LINE 1: ..._book" ("id", "title", "author", "price") VALUES ('f6b15400-... ^ СОВЕТ: Вам нужно переписать или привести выражение.

Вот мой models.py:

from django.db import models
import uuid
from django.urls import reverse
# Create your models here.

class Book(models.Model):
    id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=6, decimal_places=2)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('book_detail', args=[str(self.id)]) 

Вот views.py:

from django.shortcuts import render
from django.views.generic import ListView, DetailView
from .models import Book

# Create your views here.

class BookListView(ListView):
    model = Book
    template_name = 'books/book_list.html'
    context_object_name = 'book_list'


class BookDetailView(DetailView):
    model = Book
    template_name = 'books/book_detail.html'
    context_object_name = 'book'

Вот urls.py:

from django.urls import path
from .views import BookListView, BookDetailView

urlpatterns = [
    path('', BookListView.as_view(), name='book_list'),
    path('<uuid:pk>/', BookDetailView.as_view(), name='book_detail'),
]

Сначала добавьте поле uuid как обычное поле с другим именем:

from django.db import models
import uuid
from django.urls import reverse


class Book(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, unique=True)
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=6, decimal_places=2)

Запустите makemigrations и выполните миграцию

Теперь сделайте его первичным ключом:

class Book(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, primary_key=True)
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=6, decimal_places=2)

Это должно создать миграцию, которая удалит поле id и сделает uuid первичным ключом (makemigrations и мигрируйте снова).

И наконец:

class Book(models.Model):
    id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=6, decimal_places=2)

Возможно, вам придется скорректировать созданную миграцию.

Вернуться на верх