Объединение строк в кверисете 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}