Вопрос по иерархии моделей django: связанные атрибуты поля ManyToManyField
Как начинающий кодер, я испытываю серьезные проблемы с построением отношений между моделями.
Пожалуйста, проверьте эти два случая, Как я могу установить current_reading_pages в моем Scenario2?
from django.db import models
# Scenario1: Users can record their reading progress of a book.
class Book(models.Model):
name = models.CharField(max_length=128)
class User(models.Model):
current_reading_book = models.ForeignKey('Book', on_delete=models.CASCADE)
current_reading_page = models.IntegerField()
Результат1: Нет проблем с базой данных, но пользователи могут записывать свой прогресс только в одной книге.
Другой сценарий, который я хочу построить:
from django.db import models
# Scenario2: Users can record their reading progress of multiple books.
class Book(models.Model):
name = models.CharField(max_length=128)
class User(models.Model):
current_reading_books = models.ManyToManyField('Book')
# current_reading_pages = ???
Я хочу сохранить весь прогресс текущих книг, например, Пользователь A читает 3 книги, книга1 до страницы 100, книга2 до страницы 10, книга3 до страницы 0.
Я нашел параметр 'through' в django ManyToManyField, Мои коды стали как ниже, но это не работает, как я ожидал.
from django.db import models
# Scenario3: Using through parameter in ManyToManyField
class Book(models.Model):
name = models.CharField(max_length=128)
class User(models.Model):
current_reading_books = models.ManyToManyField('Book', through='ReadingBook')
class ReadingBook(models.Model):
book = models.ForeignKey('Book', on_delete=models.CASCADE)
current_reading_page = models.IntegerField()
ERRORS: test_model.ReadingBook: (fields.E336) Модель используется в качестве промежуточной модели 'test_model.User.current_reading_books', но у нее нет внешнего ключа к 'User' или 'Book'.
Я думаю, что первый сценарий легко реализовать. достаточно добавить атрибут user в пользовательский класс UserBook например
class UserBooks(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
current_page = models.IntegerField(default=1)
если пользователь хочет проверить свой прогресс, в views.py можно просто фильтровать по books = UserBooks.objects.filter(user=request.user)