Просто передайте контекст и передайте объект запроса. если вы используете @api_view
serializer = CustomerSerializer(customer, context={"request": request})
Для пользователя ViewSet метод get_serializer_context
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
def get_serializer_context(self):
return {'request': self.request}
Вы не можете сделать это с помощью EXECUTE IMMEDIATE
. Однако это можно сделать с помощью пакета Oracle DBMS_SQL
. В Руководстве разработчика приложений баз данных есть сравнение между EXECUTE IMMEDIATE
, с которым вы знакомы, и методами dbms_sql
. Эта страница документирует DBMS_SQL
, но содержит несколько примеров (ссылки выше), которые должны помочь вам начать работу (пример 1 - простой случай выполнения оператора, который может иметь произвольное количество переменных связывания ). DBMS_SQL
намного более громоздко с точки зрения кодирования, но позволяет делать практически все, что вы можете придумать.
Допускается несколько экземпляров переменной связывания, встречающейся в SQL. Однако вам нужно будет знать имя, используемое в качестве переменной связывания (например: var в вашем случае), чтобы передать его в DBMS_SQL.BIND_VARIABLE
.
This Thread on AskTom covers the subject in details.
In your case if you want to pass one parameter or none, you could build two queries that have a single parameter and in one of these query it is not used (i-e the predicate is always true) like this:
-- query1
SELECT * FROM DUAL WHERE dummy = :x;
-- query2
SELECT * FROM DUAL WHERE nvl(:x, 1) IS NOT NULL;
You can probably refine the predicate so that the optimizer will understand that it is always true.
One can use dbms_sql
like Steve Broberg explained but the resulting cursor can't be consumed (read) in a lot of clients. Oracle 11 has added a conversion function (dbms_sql.to_refcursor
) that makes it possible to convert a dbms_sql
cursor to a ref cursor but for some reason one can't consume this converted ref cursor in a .Net application. One can consume a normal ref cursor in .net but not a ref cursor that used to be dbms_sql
cursor.
So what kind of client will be consuming this cursor?
Эту проблему также можно обойти, используя оператор WITH
. Обычно лучше использовать DBMS_SQL
, но иногда это более простой способ:
BEGIN
EXECUTE IMMEDIATE 'WITH var AS (SELECT :var FROM dual) SELECT SYSDATE FROM DUAL WHERE (SELECT * FROM var) = (SELECT * FROM var)' USING 1;
END;