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)
Возможно, вам придется скорректировать созданную миграцию.