Возникновение проблемы при работе с django ORM или необработанным sql-запросом
list_edit_drivers.html. -это html файл для отображения данных на передней панели
$(document).ready(function () {
$.extend(true, $.fn.dataTable.defaults, {
columnDefs: [
{
targets: '_all',
defaultContent: ''
}
]
});
var table = $('#drivers').DataTable({
"pageLength": 100,
"serverSide": true,
"bSearchable":true,
"dom": 'blfrtip',
"ajax": "/fleet/dt/editdrivers/?format=datatables&city_id={{city_id}}",
"columns": [
{
"data": "employee_id",
"mRender": function (data, type, full) {
return '<a href="/fleet/driver/list_drivers/{{city_id}}/view/' + full.id + '">' + full.employee_id + '</a>';
123 }
},
{
"data": "uber_name"
},
{
"data": "mobile"
},
{
"data": "uber_device_no"
},
{
"data": "aadhar_no",
"bVisible": false,
},
{
"data": "location.name"
},
{
"data": "status"
},
{
"data": "id",
"bSortable": false,
"mRender": function (data, type, full) {
return '<a class="btn btn-sm btn-primary" href="/fleet/driver/list_drivers/{{city_id}}/edit/' + full.id + '">' + 'Edit' + '</a>';
}
}]
});
});
urls.py -ajax вызов DriverViewSet url и html рендеринг list_edit_drivers url
router.register(r'dt/editdrivers', views.DriverViewSet)
path('driver/list_drivers', views.list_edit_drivers, name='list_edit_drivers')
views.py
@method_decorator(login_required, name='dispatch')
class DriverViewSet(viewsets.ModelViewSet):
queryset = Driver.objects.filter(is_active=1)
serializer_class = DriverEditListSerializer
def get_queryset(self):
queryset = Driver.objects.filter(is_active=1, city_id=self.request.GET.get('city_id'))
return queryset
@login_required
def list_edit_drivers(request):
driver = Driver.objects.filter(city_id=request.session['global_city_id'])
context = {
'menu_hiring': 'active',
'submenu_driver_edit_list': 'active',
'driver': driver,
'city_id': request.session['global_city_id']
}
return render(request, 'hiringprocess/list_edit_drivers.html', context=context)
serializers.py
class DriverEditListSerializer(serializers.ModelSerializer):
city = CitySerializer(read_only=True)
location = LocationSerializer()
class Meta:
model = Driver
fields = ( 'id','employee_id','employer', 'name','uber_name','uber_device_no', 'mobile', 'location', 'city','shift','status', 'aadhar_no')
** Мне нужно реализовать этот sql запрос для логики изменения, мне не нужно изменять существующее имя поля и все остальное, только логику изменения на основе нижеупомянутого sql запроса raw query или ORM оба варианта подходят для меня, пожалуйста, помогите мне, я застрял здесь **
SELECT *
from fleet_driver
left join fleet_hiring on fleet_driver.id = fleet_hiring.driver_id
WHERE (fleet_driver.id < 4253 )
or (fleet_driver.id >= 4253
and (fleet_hiring.status = 'Allocation Completed' or
fleet_hiring.status = 'Training Completed'))
В вашем SQL-запросе, который вы предоставили, есть запутанный код. id<4253 и id>=4253 относятся ко всем столбцам, просто с накладкой. Я опустил его.
orm = Driver.objects.filter(
# because you have written reverse relation in hiring as driver it looks
# confusing. You might want to refactor it to hriring
driver__status__in=(
'Allocation Completed',
'Training Completed'
).filter(
# id__lt=4253,
# id__gt=4253
)
print(orm.query)
который выдает следующий запрос:
SELECT "drivers_driver"."id", "drivers_driver"."employee_id",
"drivers_driver"."name", "drivers_driver"."uber_name",
"drivers_driver"."mobile", "drivers_driver"."uber_device_no" FROM
"drivers_driver" INNER JOIN "drivers_hiring" ON
("drivers_driver"."id" = "drivers_hiring"."driver_id")
WHERE "drivers_hiring"."status" IN (Allocation Completed, Training Completed)