Вопрос по иерархии моделей 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)

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