Создает бинарную комбинацию или комбинацию всех атрибутов

Я хочу создать запрос, который создает бинарные или комбинированные атрибуты.

Например, у меня есть следующий класс

class foo(models.Model):
    m_person= models.ForeignKey('Person', on_delete=models.CASCADE)
    m_rang = models.ForeignKey('Rang', on_delete=models.CASCADE)

    m_a = models.BooleanField(default=True, name='a')
    m_b = models.BooleanField(default=False, name='b')
    m_c = models.BooleanField(default=False, name='c')
    m_d = models.BooleanField(default=False, name='d')
    ...

В настоящее время я читаю этот урок следующим образом:

obj = foo.objects.all().first()
attributes = [i for i in dir(obj) if i.startswith('m_')]

for tag in attributes:
    if hasattr(foo, tag.__name__):
         t = foo.objects.filter(person_id=aperson.pk, rang=arang).values_list(tag.__name__, flat=True)
         if True in t:
             do somthing

Поэтому я пробегаюсь по всем экземплярам, которые соответствуют человеку и званию, чтобы затем проверить атрибут. Наверняка в комбинации это как-то более разумно. На самом деле я бы хотел считывать из базы данных комбинированный класс "или", чтобы обрабатывать его дальше. вместо того, чтобы опрашивать каждый атрибут по отдельности... поскольку мне нужна ссылка "или", можно было бы как-то использовать first(value = true).

Мое желание было бы примерно таким:

f = foo.objects.filter(person_id=aperson.pk, rang=arang).OR()

где атрибуты затем объединяются в нечто подобное:

f.m_a = foo[0].m_a | foo[1].m_a | foo[2].m_a...
f.m_b = foo[0].m_b | foo[1].m_b | foo[2].m_b...
f.m_c = foo[0].m_c | foo[1].m_c | foo[2].m_c...
f.m_d = foo[0].m_d | foo[1].m_d | foo[2].m_d...
...

с: foo[0] & foo[1] & foo[2] & ... элемент из person_id=aperson.pk и rang=arang

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