Size: a a a

Django [ru] #STAY HOME

2021 March 29

SS

Sergei Sergeevich in Django [ru] #STAY HOME
Dan Tyan
если есть вероятность что могут буть +два одинаковых path
будет исключение
items = queryset.filter(Q(path=path) | Q(path='*')).all()
if len(items) == 1:
 return items[0]
if len(items) > 1:
 return next(i for i in items if i.path == path)
return None
тогда вот так - получается только один запрос? а path у меня unique
источник

S

Stepan in Django [ru] #STAY HOME
Sergei Sergeevich
items = queryset.filter(Q(path=path) | Q(path='*')).all()
if len(items) == 1:
 return items[0]
if len(items) > 1:
 return next(i for i in items if i.path == path)
return None
тогда вот так - получается только один запрос? а path у меня unique
нет, len дергает большой запрос, count поменьше
источник

AK

Anvar Khamidov in Django [ru] #STAY HOME
Вопрос другой.
Как написать выражение для условия в Q, например, чтобы сравнить 2 таблицы по определенному значению?
источник

SS

Sergei Sergeevich in Django [ru] #STAY HOME
Stepan
нет, len дергает большой запрос, count поменьше
но я не хочу запросы дергать, я хочу загрузить итемы в лист и посмотреть его длинну
источник

SS

Sergei Sergeevich in Django [ru] #STAY HOME
Stepan
нет, len дергает большой запрос, count поменьше
это же не метод кверисета
источник

S

Stepan in Django [ru] #STAY HOME
Sergei Sergeevich
но я не хочу запросы дергать, я хочу загрузить итемы в лист и посмотреть его длинну
загрузить итеми в память - 1 запрос, а посмотреть длину - другой
источник

S

Stepan in Django [ru] #STAY HOME
Sergei Sergeevich
это же не метод кверисета
Не понял
источник

S

Sergei in Django [ru] #STAY HOME
Dan Tyan
если нужено добавить поля в промежуточную таблицу
я указал , но не вижу в БД никакой новой таблицы и полей..((
источник

SS

Sergei Sergeevich in Django [ru] #STAY HOME
Stepan
загрузить итеми в память - 1 запрос, а посмотреть длину - другой
а что нельзя просто посмотреть длинну загруженных в память элементов? как len(('a','b','c'))
источник

S

Stepan in Django [ru] #STAY HOME
Sergei Sergeevich
а что нельзя просто посмотреть длинну загруженных в память элементов? как len(('a','b','c'))
почитай доку о qs оны ленивые
источник

SS

Sergei Sergeevich in Django [ru] #STAY HOME
Stepan
почитай доку о qs оны ленивые
баалин :)
источник

DT

Dan Tyan in Django [ru] #STAY HOME
Sergei
я указал , но не вижу в БД никакой новой таблицы и полей..((
а ты как смотрел ?
источник

S

Shodmon in Django [ru] #STAY HOME
Sergei Sergeevich
items = queryset.filter(Q(path=path) | Q(path='*')).all()
if len(items) == 1:
 return items[0]
if len(items) > 1:
 return next(i for i in items if i.path == path)
return None
тогда вот так - получается только один запрос? а path у меня unique
кто-нибудь может мне тупому объяснить, зачем тут некст?
источник

SS

Sergei Sergeevich in Django [ru] #STAY HOME
Shodmon
кто-нибудь может мне тупому объяснить, зачем тут некст?
ну как, я же думал что после all() получу простой массив элементов, вот и использовал next что бы найти в нем нужный элемент опираясь на значение path (работает кстати)
источник

S

Shodmon in Django [ru] #STAY HOME
Sergei Sergeevich
ну как, я же думал что после all() получу простой массив элементов, вот и использовал next что бы найти в нем нужный элемент опираясь на значение path (работает кстати)
найти нужный элемент? а твой фильтр зачем?
источник

SS

Sergei Sergeevich in Django [ru] #STAY HOME
Shodmon
найти нужный элемент? а твой фильтр зачем?
но фильтр может вернуть два элемента, и среди них  мне нужно выбрать тот что с path а не с *
источник

S

Stepan in Django [ru] #STAY HOME
Shodmon
кто-нибудь может мне тупому объяснить, зачем тут некст?
типо если в qs будет несколько obj оно вернет 1, но вообще оно там не особо вписывается)
источник

SS

Sergei Sergeevich in Django [ru] #STAY HOME
items = queryset.filter(Q(path=path) | Q(path='*'))
count = items.count()
if count == 1:
   return items.get()
if count > 1:
   return items.get(path=path)
return None
Вот новая версия. Оказывается я не вьезжаю в абстракцию с ленивыми queryset.
источник

S

Shodmon in Django [ru] #STAY HOME
Sergei Sergeevich
items = queryset.filter(Q(path=path) | Q(path='*'))
count = items.count()
if count == 1:
   return items.get()
if count > 1:
   return items.get(path=path)
return None
Вот новая версия. Оказывается я не вьезжаю в абстракцию с ленивыми queryset.
if queryset.filter(path=path).exists():
return queryset.filter(path=path).first()
else:
return queryset.filter(path='*').first()

или

obj = queryset.filter(path=path).first()
if not obj:
obj = queryset.filter(path='*').first()

return obj
источник

S

Shodmon in Django [ru] #STAY HOME
Shodmon
if queryset.filter(path=path).exists():
return queryset.filter(path=path).first()
else:
return queryset.filter(path='*').first()

или

obj = queryset.filter(path=path).first()
if not obj:
obj = queryset.filter(path='*').first()

return obj
это то что ты делаешь?
источник