Доступ к django связанному статусу модели в пользовательских менеджерах - PullRequest
0 голосов
/ 24 февраля 2019

Я использую библиотеку model_utils в Django.

У меня есть две модели, как показано ниже

class Book(TimeStampedModel):
    STATUS_CHOICES = Choices(
        (0, 'public', _('public')),
        (1, 'private', _('private')),
    )

    status = models.IntegerField(
        verbose_name=_('status'),
        choices=STATUS_CHOICES,
        default=STATUS_CHOICES.public,
        db_index=True,
    )

class Page(MPTTModel, AbstractPage):
    STATUS_CHOICES = Choices(
        (0, 'draft', _('draft')),
        (1, 'public', _('public')),
        (2, 'private', _('private')),
    )

    status = models.IntegerField(
            verbose_name=_('status'),
            choices=STATUS_CHOICES,
            default=STATUS_CHOICES.public,
            db_index=True,
        )

    book = models.ForeignKey(
            'book.Book',
            verbose_name=_('book'),
            related_name='pages',
            db_index=True,
            on_delete=models.CASCADE,
        )

Обе модели Book и Page имеют поле status.

У меня есть два пользовательских класса наборов запросов в managers.py.

class BookQuerySet(models.QuerySet):
    def public(self):
        return self.filter(status=self.model.STATUS_CHOICES.public)

class PageQuerySet(models.QuerySet):    
    def public(self):
        return self.filter(book__status=0,
                           status=self.model.STATUS_CHOICES.public)

Как показано выше, book__status=0 этот код, безусловно, работает, но я немного расстроен, потому что яхотелось бы использовать код, подобный self.book.model.STATUS_CHOICES.public.

. Расскажите, пожалуйста, как получить доступ к свойству объекта связанной модели.

Если я импортирую from .models import Book, это вызовет "циклический импорт".

Спасибо.

1 Ответ

0 голосов
/ 24 февраля 2019

Если I import from .models import Book, это вызовет «циклический импорт».

Это правильно, но мы можем обойти это, мы можем отложить импорт до того момента, когда он нам понадобится вметод, например:

# app/managers.py

class BookQuerySet(models.QuerySet):

    def public(self):
        return self.filter(status=self.model.STATUS_CHOICES.public)

class PageQuerySet(models.QuerySet):

    def public(self):
        <b>from .models import Book</b>  # no circular imports
        return self.filter(
            book__status=<b>Book.STATUS_CHOICES.public</b>,
            status=self.model.STATUS_CHOICES.public
        )
...