django 在自定义管理器中访问相关模型状态
django access related model status in custom managers
我在 Django 中使用 model_utils
库。
我有两个型号如下图
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
,它会导致 "circular imports"。
谢谢。
If I import from .models import Book
, it will cause "circular imports".
这是对的,但是我们可以规避它,我们可以在方法中将导入推迟到我们需要的时候,比如:
# 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
)
我在 Django 中使用 model_utils
库。
我有两个型号如下图
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
,它会导致 "circular imports"。
谢谢。
If I
import from .models import Book
, it will cause "circular imports".
这是对的,但是我们可以规避它,我们可以在方法中将导入推迟到我们需要的时候,比如:
# 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
)