У меня две модели с отношением «один ко многим».
A Book
имеет много Chapter
s. Обе модели имеют поле slug
.
Для Book
столбец slug
равен UNIQUE
.
Для Chapter
book_id
и slug
составляют UNIQUE
вместе.
Модель Chapter
также имеет поле order
. И book_id
и order
составляют UNIQUE
вместе.
Таким образом, я могу автоматически генерировать уникальные URL-адреса для книг и разрешать дублирование ярлыков для разных книг.
Текущее models.py
:
class Book(models.Model):
# other fields
slug = models.SlugField(max_length=80)
def save(self, *args, **kwargs):
if not self.pk:
self.slug = unique_slug(self.title)
return super(Book, self).save(*args, **kwargs)
class Chapter(models.Model):
#other fields
book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='chapters')
slug = models.SlugField(max_length=80)
order = models.IntegerField(null=True)
class Meta:
constraints = [
models.UniqueConstraint(fields=['book_id', 'order'], name='unique_order'),
models.UniqueConstraint(fields=['book_id', 'slug'], name='unique_slug')]
ordering = ['order']
приложения для книг urls.py
:
urlpatterns = [
# Book
path('', views.BookList.as_view(), name='book-list'),
path('create/', views.BookCreate.as_view(), name='book-create'),
path('<slug:book_slug>/', views.BookDetail.as_view(), name='book-detail'),
path('<slug:book_slug>/edit/', views.BookEdit.as_view(), name='book-edit'),
# Chapter
path('<slug:book_slug>/chapter/', views.BookDetail.as_view(), name='chapter-list'),
path('<slug:book_slug>/chapter/create/', views.ChapterCreate.as_view(), name='chapter-create'),
path('<slug:book_slug>/chapter/<slug:chapter_slug>/', views.ChapterDetail.as_view(), name='chapter-detail'),
path('<slug:book_slug>/chapter/<slug:chapter_slug>/edit/', views.ChapterEdit.as_view(), name='chapter-edit')
]
Обратной стороной является моя chapter
просмотров Я должен сначала запросить книгу и получить главу slug
с совпадающим book_id
. Раньше с главой slug
UNIQUE я просто запрашивал только таблицу глав.
Моя цель - иметь такие URL-адреса
book/rndmstrng-alice-in-the-wonderland/chapter/down-the-rabbit-hole
book/rndmstrng-some-other-book/chapter/down-the-rabbit-hole
Есть ли проблема в этом дизайне? Слишком много ограничений UNIQUE
- плохо? Есть ли лучший способ реализовать это?