Создает бинарную комбинацию или комбинацию всех атрибутов
Я хочу создать запрос, который создает бинарные или комбинированные атрибуты.
Например, у меня есть следующий класс
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