Общее правило для класса модели Django всегда исключать «неопубликованные» экземпляры - PullRequest
1 голос
/ 03 июля 2019

Я ищу способ создать какое-то правило, исключающее определенные экземпляры в каждом наборе запросов. Следовать за DRY и быть уверенным, что я (или кто-то еще) не будет случайно включать в запросы непринятые экземпляры. Я относительно новичок в Джнаго и не нашел API для решения этой проблемы.

class SomeClassModel(models.Model):
    value = models.CharField(max_length=244)
    accepted = models.BooleanField(default=False)

Как я (или кто-то еще) мог исключить непринятые экземпляры из всех запросов? Даже если я сделаю SomeClassModel.objects.all()

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Вы можете сделать Manager [Django-doc] и переопределить менеджер .objects:

class AcceptedManager(models.Manager):

    def get_queryset(self):
        return super().get_queryset().filter(<b>accepted=True</b>)

Затем вы можете указать этот objects менеджер, например:

class SomeClassModel(models.Model):
    value = models.CharField(max_length=244)
    accepted = models.BooleanField(default=False)

    <b>objects = AcceptedManager()</b>

Вы по-прежнему можете получить доступ ко всем SomeClassModel с помощью SomeClassModel._base_manager, но вы, очевидно, можете указать дополнительного менеджера:

class SomeClassModel(models.Model):
    value = models.CharField(max_length=244)
    accepted = models.BooleanField(default=False)

    objects = AcceptedManager()
    <b>all_objects = models.Manager()</b>
1 голос
/ 03 июля 2019

Вы можете использовать ModelManager и переопределить значение по умолчанию objects, например:

class ExcludeNotAccepted(models.Manager):
    def get_queryset(self):
        return super().get_queryset().exclude(accepted=False)

class SomeClassModel(models.Model):
    value = models.CharField(max_length=244)
    accepted = models.BooleanField(default=False)

    # make the default objects exclusive of non-accepted
    objects = ExcludeNotAccepted()
    # still allow explicit access via another name
    all_objects = models.Manager()

Это даст желаемый эффект при доступе к SomeClassModel.objects.all() автоматической фильтрации непринятых элементов, но вы все равно сможете получить доступ ко всем объектам, явно указав SomeClassModel.all_objects.all() ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...