Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Как избавиться от перекрёстных ссылок? [RSS Feed]

#1 Янв. 16, 2015 12:56:06

dun
От: Липецк
Зарегистрирован: 2015-01-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как избавиться от перекрёстных ссылок?

Здравствуйте!

У меня две модели - 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. Я пока не знаю, как решить проблему с получением количества комментариев к книге в рамках сериализатора, и буду признателен, если кто-нибудь подскажет, как это правильно делается.

Отредактировано dun (Янв. 16, 2015 12:56:22)

Офлайн

#2 Янв. 16, 2015 13:52:33

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Как избавиться от перекрёстных ссылок?

class Book(models.Model):
    #Тут идёт описание полей
    def comments_count(self):
        return self.comment_set.all().count()

Офлайн

#3 Янв. 19, 2015 10:54:38

dun
От: Липецк
Зарегистрирован: 2015-01-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как избавиться от перекрёстных ссылок?

Прочитал тут, что в моём случае рекомендуется описывать связи между моделями через литералы, например, так:
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()

Что скажете насчёт такого решения? Какие недостатки?

Отредактировано dun (Янв. 19, 2015 10:55:11)

Офлайн

#4 Янв. 19, 2015 14:27:27

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Как избавиться от перекрёстных ссылок?

dun
Прочитал тут
Где?

Офлайн

#5 Янв. 19, 2015 15:17:20

dun
От: Липецк
Зарегистрирован: 2015-01-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как избавиться от перекрёстных ссылок?

inoks
На StackOverflow было обсуждение, человек посоветовал именно литералы, решение набрало полсотни плюсов.

Офлайн

#6 Янв. 19, 2015 22:56:23

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Как избавиться от перекрёстных ссылок?

Чем обосновал?

Офлайн

#7 Янв. 20, 2015 07:11:49

dun
От: Липецк
Зарегистрирован: 2015-01-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как избавиться от перекрёстных ссылок?

Ссылкой на официальную документацию: http://stackoverflow.com/questions/4813293/django-python-circular-model-reference

Офлайн

#8 Янв. 20, 2015 11:46:26

infoing
От:
Зарегистрирован: 2010-09-06
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Как избавиться от перекрёстных ссылок?

А так почему нельзя сделать?

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()



Офлайн

  • Начало
  • » Django
  • » Как избавиться от перекрёстных ссылок?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version