Активация и деактивация булевых чисел Django

У меня есть первая модель под названием "Люди", которая имеет атрибут под названием "Состояние", который имеет тип Boolean, эту модель я называю в модели "День рождения". Я хочу, чтобы, когда человек неактивен в своем "State", он исчезал из модели "Birthday", а когда он снова активизируется, он появлялся в модели "Birthday".

Следует отметить, что в административной панели Django, когда я вхожу в модель "День рождения", отображаются все люди, зарегистрированные в модели "Люди", даже если они активны или нет из-за их "Состояния" (Boolean). Возможно, это можно решить с помощью условия.

class People(models.Model):
   Name = models.CharField('Name', max_length = 20, blank = False, null = False)
   Last_Name = models.CharField('Last Name', max_length = 20, blank = False, null = False)
   State = models.BooleanField('Active Client', default = True)

   class Meta:
      verbose_name = 'People'
      verbose_name_plural = 'People'
      ordering = ['Name']

   def __str__(self):
      return "{0} - {1}".format(self.Name, self.Last_Name.capitalize())



class Birthday(models.Model):
   People_Birthday = models.OneToOneField(People, on_delete = models.CASCADE)
   BirthdayCalendar = models.DateField('Birthday', blank = False, null = False)

   class Meta:
      verbose_name = 'Birthday'
      verbose_name_plural = 'Birthdays'
   
   def __str__(self):
      return str(self.People_Birthday)

Вы можете переопределить get_queryset метод менеджера модели.

class BirthdayManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(People_Birthday__State=True) #Not recommended

    def active(self):
        return super().get_queryset().filter(People_Birthday__State=True) #Recommended

Это не рекомендуется, так как это также повлияет на админсайт. (Если вы переопределите get_queryset())

Вы можете создать другой метод и всегда использовать его.

Это на менеджере, но, на мой взгляд, лучше помещать такие вещи в кверисет.

class BirthdayQuerySet(models.QuerySet):
    def active(self):
        return self.filter(People_Birthday__State=True)

Таким образом, вы можете постоянно добавлять его к вашему набору запросов. В отличие от только менеджера, который не позволяет вам использовать метод после фильтрации, например. С кверисетом вы все еще можете делать Birthday.objects.filter(date__range=your_date_range).active()

С менеджером, который будет ошибаться.

Чтобы использовать кверисет в вашей модели, добавьте этот атрибут к вашей модели:

objects = BirthdayQuerySet.as_manager()

Чтобы использовать modelmanager:

objects = BirthdayManager()

Вы можете использовать оба варианта, но это выходит за рамки данного вопроса.

Сиденотат:

Person - единственное число. Люди - множественное число.

Вернуться на верх