
Igor
31.08.2017
09:38:06
Спасибо), а как еще этот коунт отфильтровывать по статусу?

Hot
31.08.2017
09:48:12
Ребятки, у меня тут Django ORM дичайше бесоёбит.
Вот скажите мне, filter и count - это read-only операции?

Dan
31.08.2017
09:48:35
что делает ?

Google

Hot
31.08.2017
09:48:40
Они состояние БД как-то могут поменять?
Беосёбит её.
Дичайше.

Dan
31.08.2017
09:48:48
нет

Hot
31.08.2017
09:48:57
Она на одни и те же запросы возвращает то, что хочет.

Dan
31.08.2017
09:49:09
не может быть такого

Hot
31.08.2017
09:49:09
Причём SQL-код один и тот же.
И из консоли БД показывает один и тот же результат.
Я бы сам не поверил.

Dan
31.08.2017
09:50:55
показывай ORM конструкцию
и между чем и чем разница разница ?

Hot
31.08.2017
09:51:59
Между результатом запроса и результатом этого же запроса xD
Причём у меня тут не один такой запрос xD

Google

Hot
31.08.2017
09:52:30
In [135]: Group.objects.filter(from_1c=False).count()
Out[135]: 244500
In [136]: Group.objects.filter(from_1c=False).count()
Out[136]: 259
Вот пример.
Это из свежего xD
Но это не всё!

Denis
31.08.2017
09:53:02
База менялась между запросами

Hot
31.08.2017
09:53:06
Давайте я покажу чуть расширенную версию!
In [134]: Product.objects.filter(groups__not_in=Group.objects.filter(from_1c=False)).count()
Out[134]: 244500
In [135]: Group.objects.filter(from_1c=False).count()
Out[135]: 244500
In [136]: Group.objects.filter(from_1c=False).count()
Out[136]: 259
Прикол в том, что процессов, которые могли бы её менять - нет.

Denis
31.08.2017
09:53:44
Не надо так писать

Hot
31.08.2017
09:53:47
А прямой запрос в консоль MySQL в своих результатах однозначен.

Denis
31.08.2017
09:54:24
Product.objects.exclude(groups__from_1c=False) попробуй

Hot
31.08.2017
09:55:15
In [79]: Product.objects.exclude(groups__from_1c=False).count()
Out[79]: 237565
In [80]: Product.objects.exclude(groups__from_1c=False).count()
Out[80]: 237565
No comments guys.

Denis
31.08.2017
09:55:50
in с нетривиальными выражениями опасно делать
Теперь глянь sql и убедись, что это то, что надо

Hot
31.08.2017
09:57:44
Запросы разные xD
SQL-код всмысле.
Ну, я его немножко переписал, потому что от count() мне query не получить.
mysql> SELECT COUNT(*) FROM `catalog_product` WHERE NOT (`catalog_product`.`code` IN (SELECT U1.`product_id` AS Col1 FROM `processor_producttogroup` U1 INNER JOIN `processor_group` U2 ON ( U1.`group_id` = U2.`id` ) WHERE U2.`from_1c` = False));
+----------+
| COUNT(*) |
+----------+
| 237565 |
+----------+
1 row in set (0.66 sec)
mysql> SELECT COUNT(*) FROM `catalog_product` INNER JOIN `processor_producttogroup` ON ( `catalog_product`.`code` = `processor_producttogroup`.`product_id` ) WHERE (`processor_producttogroup`.`group_id`) IN (SELECT U0.`id` FROM `processor_group` U0 WHERE U0.`from_1c` = False);
+----------+
| COUNT(*) |
+----------+
| 244500 |
+----------+
1 row in set (0.77 sec)
Оооо да, детка!

Google

Hot
31.08.2017
10:05:12
In [137]: Product.objects.filter(groups__not_in=Group.objects.filter(from_1c=False)).count()
Out[137]: 259
In [138]: Group.objects.filter(from_1c=False).count()
Out[138]: 244500
In [139]: Group.objects.filter(from_1c=False).count()
Out[139]: 259
In [140]: Product.objects.filter(groups__not_in=Group.objects.filter(from_1c=False)).count()
Out[140]: 259
In [141]: Product.objects.filter(groups__not_in=Group.objects.filter(from_1c=False)).count()
Out[141]: 244500
Мне же обещали сложные задачи.
Хотя по-моему, поехавшая на всю голову ORM - это перебор.

Artyem
31.08.2017
10:09:33
орм то явно непричём, всё чо она делает это возвращает ответ из базы.
есть конечно вариант что что-то неявным образом у вас патчит запросы, и допустим данные берутся из кеша, вместо запроса в бд

Hot
31.08.2017
10:11:22
Да я вроде понял.
Если сдвинуть результаты от запросов на одну строку - то всё выдаётся то, что нужно и так, как нужно.

Artyem
31.08.2017
10:11:40
LOGGING в настройках джанги используется?

Hot
31.08.2017
10:11:46
То есть у меня упоролся интерпретатор.
Сейчас ищу, где именно.
И не могу найти.

Artem
31.08.2017
10:14:54
И не могу найти.
сколько сообщений я прочитал, вообщем, такая балалайка может идти, когда делаешь order_by по удаленному полю, но в твоем случае хрень какая-то

Hot
31.08.2017
10:15:57
У меня всё-таки упоролась именно ORM.
Интерпретатор на обычной арифметике ведёт себя нормально.

Artem
31.08.2017
10:16:21
попробуй еще сделать таким образом:
Product.objects.annotate(cnt_groups=Count('groups')).filter(groups__not_in=Group.objects.filter(from_1c=False))
или же с CASE...WHEN

Hot
31.08.2017
10:16:35
Не, я хочу понять первопричину.
Суть этих граблей.

Artem
31.08.2017
10:16:45
я думаю, там херня творится, что каунтер не правильно себя ведет

Hot
31.08.2017
10:16:49
Это же тянет на статейку на хабр или пост в блог.

Artem
31.08.2017
10:17:25

Google

Denis
31.08.2017
10:17:33
В нормальном питоне проблема сохраняется?

Artem
31.08.2017
10:18:14
и вообще, довольно странное поведение, тут скоре умение готовить ОРМку

Hot
31.08.2017
10:19:20
В другой вкладке оно ведёт себя как надо.
Поэтому сохранил полный лог, и на досуге планирую разбор полётов и куда-нибудь выложить свои выводы по этому поводу.
УПОЛЗ ПИТОН

Artem
31.08.2017
10:25:52
включая и кастомные Аггрегационные функции

Hot
31.08.2017
10:26:34
Беда либо в ipython, либо в шелле от django, либо в ORM.

Artem
31.08.2017
10:26:38
Мир. Труд, Жвачка.

Hot
31.08.2017
10:26:44
У меня ORM уползла.
На 1 запрос вперёд.

Artem
31.08.2017
10:26:53
а какая версия жанги?

Hot
31.08.2017
10:26:55
Точнее вывод из неё.
1.8.18

Artem
31.08.2017
10:27:29
Точнее вывод из неё.
настрой логгинг, что бы при наборе запроса, она тебе принтовала дебажные запросы
и все станет ясно
сможешь точно сверить что делаешь не так
и кто в этом случае не прав

Hot
31.08.2017
10:28:39
Да я очкую из интерпретатора выходить.
Или можно логи прямо там врубить?

Google

Artem
31.08.2017
10:39:54
вообще, можно и прям там
LOGGING = {
'version': 1,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s '
'%(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
}
},
'loggers': {
'django': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True,
},
}
}
этого должно хватить
и потом сделай:
from django.conf import settings
settings.LOGGING = LOGGING
и бей вновь запросы, там должны логироваться

Hot
31.08.2017
10:43:14
А где он логи сохранит?

Artem
31.08.2017
10:43:38
нигде, реалтаймом отображает в консольке
как запросы будешь выполнять

Hot
31.08.2017
10:43:48
А ещё, можно ли как-то в этой ORM сказать, что поле должно быть уникальным при запросе? То есть, если оно нашло тачку синего цвета, то другие синие тачки игнорить.
Не отображает :(

Artem
31.08.2017
10:44:22
да, это делаешь DISTINCT по условию
а не, соврал
делаешь аннотацию для конкретики синего цвета, и по тому полю цвета, делаешь дистинк. После чего оно добавится в гроуп бай и у тебя будет строго одного тачка синего цвета

Ahmed
31.08.2017
10:57:33
Ребята меня этот докер и youtube-dl заебал уже, установил ffmpeg в контейнер celery, но все равно ругается типа его нет надо установить
celery_1 | youtube_dl.utils.DownloadError: ERROR: ffprobe or avprobe not found. Please install one

Artem
31.08.2017
10:58:19

Ahmed
31.08.2017
10:58:45

Artem
31.08.2017
10:58:54
еще лучше

serbernar
31.08.2017
10:59:58
Какие-то гейские стикеры

Igor
31.08.2017
11:03:18
Если у меня в models.py первого модуля импортируется класс с models.py втогого модуля, то как мне сделать импорт в models.py второго модуля класса с models.py первого модуля??
По моему оно заходит в перехрестный импорт и ломается((