Найти - Пользователи
Полная версия: Django 1.8 как сделать фильтр по вычисляемому полю
Начало » Python для новичков » Django 1.8 как сделать фильтр по вычисляемому полю
1
and_07
и так суть
class Test(model):
    name = text()
    def _test_field(self):
        return md5(self.name + str(self.id))
    test_field = properti(_test_field)
Test.objects.filter(test_field = 'werwer76234fsdfsdf')

код образный для обозначения проблемы
FishHook
Методами ОРМ? Никак, разумеется! Как вы себе представляете SQL-запрос, который должна была бы сгенерировать ОРМ?
and_07
ну как то так
select * from test
where md5(concat(id,name)) = 'werwer76234fsdfsdf'


сделал через
Test.objects.raw

просто думал есть что то встроенное
FishHook
and_07
просто думал есть что то встроенное
Ок, а если я нахерачу такую функцию?
class Test(model):
    name = text()
    def _test_field(self):
        res = md5(self.name + str(self.id))
        return res + "@{}@".format(res)
    test_field = properti(_test_field)
Test.objects.filter(test_field = 'werwer76234fsdfsdf')
and_07
ну я без понятия зачем вам это

я к тому что если в данном случае
Test.objects.raw
кашерно то ОК
plusplus
Приспрошусь тут, а вообще в Django можно как-то кастомные СУБД-шные функции вызывать? Кроме встроенных Avg, Max и Sum. Та же md5 из примера.
FishHook
plusplus
А почему нет то? Код джанги открыт, берите пример (Avg, Max и Sum) и делайте по примеру свою функцию.
Прикол ОРМ в том, что она гарантирует работоспособность одного и того же кода, для разных СУБД. Не уверен, что во всех поддерживаемых джангой СУБД есть функция md5. Я бы в задаче топикстартера не стал бы изобретать велосипед и отфильтровал бы питоном. Хотя, наверняка сама постановка задачи неоптимальна и можно обойтись безо всяких таких странных хешей. В любом случае, если нужен некий уникальный функционал и на кроссплатформенность плевать, ну сделай ты хранимку, делов то.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB