Возникновение проблемы при работе с 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)
Вернуться на верх