Как можно провести сравнение в цикле?
Есть такой код. Нужно провести сравнение, чтобы все строки были равны соответствующим. Можно сделать это как-то красивее, в цикле или что-то типа того? Заранее спасибо за помощь.
qs_cart = ECart.objects.filter(user_id=obj.user_id)
qs_delivery = EOrderDelivery.objects.filter(order_id__in=qs_cart.values('order_id'))
for idx, obj in enumerate(qs_delivery):
if idx == 0:
fields = ['city', 'country', 'flat', 'house', 'region', 'street', 'postal_code']
obj_ok = obj
id_ok = qs_cart[0].order_id
else:
if (getattr(obj, fields[0]) == getattr(obj_ok, fields[0])) and (
getattr(obj, fields[1]) == getattr(obj_ok, fields[1])) and (
getattr(obj, fields[2]) == getattr(obj_ok, fields[2])) and (
getattr(obj, fields[3]) == getattr(obj_ok, fields[3])) and (
getattr(obj, fields[4]) == getattr(obj_ok, fields[4])) and (
getattr(obj, fields[5]) == getattr(obj_ok, fields[5])) and (
getattr(obj, fields[6]) == getattr(obj_ok, fields[6])):
qs_cart.update(order_id=id_ok)
Ответы (1 шт):
Автор решения: Zhihar
→ Ссылка
например так:
fields = ['city', 'country', 'flat', 'house', 'region', 'street', 'postal_code']
# формируем список значений по полям
obj_data = [getattr(obj, name) for name in fields]
obj_ok_data = [getattr(obj_ok, name) for name in fields]
# сравниваем
if all([i[0] == i[1] for i in zip(obj_data, obj_ok_data)]):
print()
или даже так:
fields = ['city', 'country', 'flat', 'house', 'region', 'street', 'postal_code']
# формируем список значений по полям
obj_data = [getattr(obj, name) for name in fields]
obj_ok_data = [getattr(obj_ok, name) for name in fields]
# сравниваем
if obj_data == obj_ok_data:
print()
а если мучать первый вариант, то:
fields = ['city', 'country', 'flat', 'house', 'region', 'street', 'postal_code']
# формируем список значений по полям и сравниваем
if all(getattr(obj, name) == getattr(obj_ok, name) for name in fields):
print()
наверное последний вариант самый красивый