按日期联系的自定义过滤器 - django rest framework

时间:2017-04-19 07:09:04

标签: angularjs django django-rest-framework

我有一个表格,其中显示有关组织的信息,我有一个机制,它在组织上触发下一个操作日期,这是在组织上手动设置的。 现在,我已在桌面上添加了自定义datepicker字段,因此我可以根据所需日期对其进行过滤,并在所选日期显示该组织的所有next action date,因此我可以将值传递给Controller,以便我可以抓住restAPI,而rest我希望过滤日期等于或等于现在所以我可以通过下一个行动日期向组织展示。 我的问题是如何过滤日期之前或等于现在,我真的迷失在这里,所以有人可以帮助我并解释我如何在我的ModelViewSet中做到这一点。

ModelViewSet:

from rest_framework import viewsets, permissions, filters

from cms.restapi.pagination import StandardResultsOffsetPagination
from cms_sales.models import LeadContact
from cms_sales.restapi.permissions.lead_contact_permissions import LeadContactPermissions
from cms_sales.restapi.serializers.lead_contact_serializer import LeadContactSerializer


class LeadContactViewSet(viewsets.ModelViewSet):
    def get_queryset(self):
        queryset = LeadContact.objects.none()
        user = self.request.user
        if user.has_perm('vinclucms_sales.can_view_full_lead_contact_list'):
            queryset = LeadContact.objects.all()
        elif user.has_perm('vinclucms_sales.can_view_lead_contact'):
            queryset = LeadContact.objects.filter(account_handler=user)
        return queryset

    serializer_class = LeadContactSerializer

    filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)

    filter_fields = ('account_handler',)

    ordering_fields = (
        'first_name', 'last_name', 'account_handler__first_name', 'account_handler__last_name',
        'sub_organization_name', 'organization_name', 'next_action_date', 'serial_number',
        'next_action_date', 'status_text', 'select_date')

    search_fields = (
        'first_name', 'last_name', 'account_handler__first_name', 'account_handler__last_name',
        'sub_organization_name', 'organization_name', 'next_action_date', 'serial_number',
        'next_action_date', 'status_text', 'select_date')

    pagination_class = StandardResultsOffsetPagination

    permission_classes = [permissions.IsAuthenticated, LeadContactPermissions]

我通过datepicker字段的Cotroller:

app = angular.module 'cms.sales'

app.controller 'LeadContactListCtrl', ['$scope', '$rootScope', '$compile', 'LeadContacts'
  ($scope, $rootScope, $compile, LeadContacts) ->
    savedSuccessMessage = "Lead Contact List was updated"
    savedFailMessage = "Failed to update lead contact list"

    $scope.init = ()->
      fetchLeadContacts()

    fetchLeadContacts = () ->
      $('#expensesListTable').DataTable(
        createdRow: (row, data, index) ->
          $compile(row)($scope)
        sDom: 'lfrtip'
        processing: true
        serverSide: true
        searchDelay: 1000
        orderMulti: false
        pageLength: 25
        ajax:
          url: '/api/sales/lead_contact/'
          data: (data) ->
            data.limit = data.length
            data.offset = data.start
            data.search = data.search['value']
            if data.order[0]['dir'] == 'asc'
              data.ordering = data.columns[data.order[0]['column']].name
            else
              data.ordering = '-' + data.columns[data.order[0]['column']].name
            return 0
          dataFilter: (data) ->
            json = jQuery.parseJSON(data)
            json.recordsTotal = json.count
            json.recordsFiltered = json.count
            json.data = json.results
            return JSON.stringify json
        columns: [
          {
            data: 'serial_number'
            name: 'serial_number'
            render: (data, type, row, meta) ->
              return '<a href="{{ site.domain }}' + row.absolute_url + '">' + data + '</a>'
          }
          {
            name: 'first_name,last_name'
            render: (data, type, row, meta)->
              return row['first_name'] + ' ' + row['last_name']
          }
          {
            data: 'organization_name'
            name: 'organization_name'
          }
          {
            data: 'sub_organization_name'
            name: 'sub_organization_name'
          }
          {
            data: 'account_handler'
            name: 'account_handler__first_name, account_handler__last_name'
            render: (data, type, row, meta)->
              return data['first_name'] + ' ' + data['last_name']
          }
          {
            data: 'status_text'
            name: 'status_text'
            render: (data, type, row, meta)->
              return "<span class='" + row['status_display_class'] + "'>" + data + "</span>"
          }
          {
            data: "next_action_date"
            name: "next_action_date"
            render: (data, type, row, meta)->
              initValue = data
              if data
                initValue = "'" + data + "'"
              return '<div class="input-control text" data-role="datepicker"
                         ng-controller="ContactDateCtrl"
                         ng-init="init(' + row['pk'] + ', ' + initValue + ')"
                         data-format="mmmm d, yyyy">
                        <input type="text" ng-model="contactDate" ng-change="onChange()">
                        <button class="button"><span class="mif-calendar"></span></button>
                    </div>'
          }
        ])

    $scope.SelectLeadContacts = () ->
      params = {}
      if $scope.lead_contact.id
        params['id'] = $scope.lead_contact.id
        LeadContacts.update(params).$promise.then saveSuccessCallback, saveFailedCallback
      else
        LeadContacts.save(params).$promise.then saveSuccessCallback, saveFailedCallback

    saveSuccessCallback = (response) ->
      ClientNotifications.showNotification("Success", savedSuccessMessage, "success")

    saveFailedCallback = (error) ->
      ClientNotifications.showNotification("Alert", savedFailMessage, "alert")

    $scope.showAddNew = ()->
      initNewLeadContacts()

    initNewLeadContacts = ()->
      $scope.lead_contact = {}
      $scope.lead_contact.select_date = 'Jan 1, 2200'

]

模板:

{% extends "site_base.html" %}
{% load i18n static %}

{% block head_title %}Lead contact list{% endblock %}

{% block ng_app %}cms.sales{% endblock %}

{% block body %}
    <div class="grid">
        <div class="row">
            <h2 class="align-center">
                <strong>
                    {% trans "Contact leads List" %}
                </strong>
            </h2>
        </div>
    </div>
    <div class="flex-grid"
         ng-controller="LeadContactListCtrl"
         ng-init="init()">
        <div class="row">
            <div class="cell size-p20 padding10">
                <label for="id_select_date">Select Date: *</label>
                <div class="full-size">
                    <div class="input-control full-size text"
                    data-role="datepicker" date-format="mmmm d, yyyy">
                        <input id="id_select_date" ng-model="lead_contact.select_date"/>
                        <button class="button"><span class="mif-calendar"></span></button>
                    </div>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="cell size-p20 padding10">
                <button class="button primary" ng-click="SelectLeadContacts()">
                    {% trans "Submit" %}
                </button>
            </div>
        </div>
        <div class="row">
            <div class="cell size-p100 padding10">
                <table title="Contact leads List" class="dataTable" id="contactLeadsList">
                    <thead>
                    <tr>
                        <th>{% trans 'Serial Number' %}</th>
                        <th>{% trans 'Lead name' %}</th>
                        <th>{% trans 'Organization' %}</th>
                        <th>{% trans 'Sub-organization' %}</th>
                        <th>{% trans 'Handler' %}</th>
                        <th>{% trans 'Sale status' %}</th>
                        <th>{% trans 'Next communication date' %}</th>
                    </tr>
                    </thead>
                </table>
            </div>
        </div>
    </div>
{% endblock %}

1 个答案:

答案 0 :(得分:1)

我不确定我是否已完全理解您的要求,但过滤QuerySet以便将来只显示next_action_date的对象,您可以使用:

import datetime
LeadContact.objects.filter(next_action_date__gte=datetime.date.today())

并仅显示过去使用日期的那些:

LeadContact.objects.filter(next_action_date__lte=datetime.date.today())

有关按日期过滤QuerySet的更详细指南,请参阅this answer。特别是,如果next_action_date字段的类型是日期时间,请使用datetime.datetime.now()而不是datetime.date.today()。更多信息也在QuerySet docs