Объединение строк в кверисете django

У меня есть набор запросов с атрибутами location, person и error

Мне нужно либо создать новый набор запросов, либо отредактировать существующий таким образом, чтобы строки "объединялись" на основе определенного критерия. Этим критерием является совпадение местоположения и человека. После объединения я хочу, чтобы значение ошибки было истинным, если в любой из объединяемых строк было истинное значение. В этом случае таблица должна быть изменена следующим образом:

Location Person Error
L1 P1 false
L1 P1 true
L2 P2 false
L2 P2 false
Location Person Error
L1 P1 true
L2 P2 false

Хорошо, чтобы помочь вам, вы можете сделать следующее:

MyModel.objects.filter(your query).values('location', 'person').distinct()

При использовании .distinct() дубликатов не будет, и вы добьетесь желаемого. (что также служит цели, если местоположение и человек одинаковы для двух строк)

Для этой цели следует использовать не aggregate(), а annotate() (docs).

Ввод:

class T(models.Model):
    person = models.CharField(max_length=10)
    location = models.CharField(max_length=10)
    error = models.BooleanField()

T.objects.bulk_create([
    T(person='P1', location='L1', error=False),
    T(person='P1', location='L1', error=True),
    T(person='P2', location='L2', error=False),
    T(person='P2', location='L2', error=False)
])
for t in T.objects.all().values('person', 'location').distinct().annotate(error=Sum('error')):
    print(t)

Выход:

{'person': 'P1', 'location': 'L1', 'error': True}
{'person': 'P2', 'location': 'L2', 'error': False}
Вернуться на верх