Search code examples
pythondjangodjango-views

Django: earliest() and latest() require either fields as positional arguments or 'get_latest_by' in the model's Meta


Can Anyone please explain me what this error means??

I have done this in my views.py:

class FormListView(FormMixin, ListView):
def get(self, request, *args, **kwargs):
    # From ProcessFormMixin
    form_class = self.get_form_class()
    self.form = self.get_form(form_class)

    # From BaseListView
    self.object_list = self.get_queryset()
    allow_empty = self.get_allow_empty()
    if not allow_empty and len(self.object_list) == 0:
        raise Http404(_(u"Empty list and '%(class_name)s.allow_empty' is False.")
                      % {'class_name': self.__class__.__name__})

    context = self.get_context_data(object_list=self.object_list, form=self.form)
    return self.render_to_response(context)

def post(self, request, *args, **kwargs):
    return self.get(request, *args, **kwargs)


class CompanyListView(LoginRequiredMixin,FormListView):
    model = Company
    form_class  = daterangeform
    paginate_by = 10

    def get_queryset(self):
        return company.objects.filter(User=self.request.user)

    def get_context_data(self, **kwargs):
        context = super(companyListView, self).get_context_data(**kwargs)
        context['selectdate_list'] = selectdate.objects.filter(User=self.request.user).latest()
        return context

And I am getting this error:

ValueError: earliest() and latest() require either fields as positional arguments or 'get_latest_by' in the model's Meta.

Can anyone please explain me what is wrong in my code and possible solution for doing it in correct way...

Thank you


Solution

  • As specified in the documentation for latest(*fields) [Django-doc]:

    Returns the latest object in the table based on the given field(s).

    This example returns the latest Entry in the table, according to the pub_date field:

    Entry.objects.latest('pub_date')
    

    So if you want to obtain the latest object with respect to a field (for example updated_date), you can write this as:

    selectdate.objects.filter(
        User=self.request.user
    ).latest('updated_date')
    

    You can however use the latest() without parameters, given you specified the order for this in the Meta class of the model, like:

    class Foo(models.Model):
        name = models.CharField(max_length=20)
    
        class Meta:
            get_latest_by = ['name']

    In that case

    Foo.objects.latest()
    

    will give the Foo object with the maximum name (if we here compare the names lexicographically).