Найти - Пользователи
Полная версия: Как избавиться от перекрёстных ссылок?
Начало » Django » Как избавиться от перекрёстных ссылок?
1
dun
Здравствуйте!

У меня две модели - Book и Comment:
book/models.py
class Book(models.Model):
    #Тут идёт описание полей
    def comments_count(self):
        from comment.models import Comment
        return len(Comment.objects.filter(book=self))

comment/models.py
#Импорт стандартных модулей и т.д.
from book.models import Book
class Comment(models.Model):
    #Другие поля
    book = models.ForeignKey(Book, verbose_name='Ссылка на книгу')

Как видите, у меня появляются перекрёстные ссылки. Везде читаю, что хотя метод Book.comments_count() будет работать, такая структура с циклическими ссылками - серьёзный повод для рефакторинга. Как его правильно провести?

P.S. Метод comments_count() нужен для упрощения работы с сериализаторами Django REST Framework. Я пока не знаю, как решить проблему с получением количества комментариев к книге в рамках сериализатора, и буду признателен, если кто-нибудь подскажет, как это правильно делается.
botinag
class Book(models.Model):
    #Тут идёт описание полей
    def comments_count(self):
        return self.comment_set.all().count()
dun
Прочитал тут, что в моём случае рекомендуется описывать связи между моделями через литералы, например, так:
book/models.py
from comment.models import BookComment
class Book(models.Model):
    title = models.CharField(max_length=300)
    def comments_count(self):
        return BookComment.objects.filter(book=self).count()

comment/models.py
class BookComment(models.Model):
    book = models.ForeignKey('book.Book')
    text = models.TextField()

Что скажете насчёт такого решения? Какие недостатки?
inoks
dun
Прочитал тут
Где?
dun
inoks
На StackOverflow было обсуждение, человек посоветовал именно литералы, решение набрало полсотни плюсов.
inoks
Чем обосновал?
dun
Ссылкой на официальную документацию: http://stackoverflow.com/questions/4813293/django-python-circular-model-reference
infoing
А так почему нельзя сделать?

comment/models.py
from book.models import Book
class BookComment(models.Model):
    book = models.ForeignKey(Book)
    text = models.TextField()

book/models.py
class Book(models.Model):
    title = models.CharField(max_length=300)
    def comments_count(self):
        return self.comment_set.count()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB