Модуль фильтра Django: выражение поиска (год) не возвращает нужный набор запросов
Я использую модуль django-filter. Я хотел бы получить все объекты, год которых 2011 или больше.
вот моя установка ...
Актуальное поведение:
Когда я ввожу год, то получаю сообщение об ошибке: "Введите действительную дату." и набор запросов не изменяется.
.Я попробовал ввести дату вместо года, но тогда вся страница проваливается с сообщением об ошибке
Field 'None' expected a number but got datetime.date(2011, 1, 1)
.
Модель:
class BaseInvoice(models.Model):
id = ShortUUIDField(primary_key=True)
invoive_number = models.CharField(max_length=50)
invoicing_party_ID = models.ForeignKey(InvoicingParty, on_delete=models.CASCADE)
invoice_type = models.CharField(
max_length=2,
choices=invoice_type,
default='IN'
)
realestate_id = models.ForeignKey(RealEstate, on_delete=models.CASCADE)
user_group = models.ForeignKey(Group, on_delete=models.CASCADE)
year_of_contribution = models.DateField(auto_now=False, auto_now_add=False)
start_of_period = models.DateField(auto_now=False, auto_now_add=False)
end_of_period = models.DateField(auto_now=False, auto_now_add=False)
interval = models.ForeignKey(Interval, on_delete=models.CASCADE, default=0)
currency = models.ForeignKey(Currency, on_delete=models.CASCADE, default='EUR')
class Meta:
abstract = True
class RealEstateTax(BaseInvoice):
realestate_tax = models.DecimalField(max_digits=20, decimal_places=2)
Фильтр
import django_filters
from django_filters import DateFilter
from .models import *
class InvoiceFilter(django_filters.FilterSet):
billing_year = DateFilter(
label='Abrechnungsjahr',
field_name='start_of_period',
lookup_expr='year__gt'
)
class Meta:
model = RealEstateTax
fields = ['realestate_id', 'billing_year']
Вид
from realestate.models import RealEstate
from django.shortcuts import render
from django.http import HttpResponse
from .models import *
from .filters import InvoiceFilter
from django.db.models import Sum
def utilities_bill(request):
realestate_tax = RealEstateTax.objects.all()
insurance_invoice = InsuranceInvoice.objects.all()
raTaxFilter = InvoiceFilter(request.GET, queryset=realestate_tax)
inFilter = InvoiceFilter(request.GET, queryset=insurance_invoice)
realestate_tax = raTaxFilter.qs
insurance_invoice = inFilter.qs
realestate_sum = realestate_tax.aggregate(Sum('realestate_tax'))['realestate_tax__sum']
print(request.GET)
context = {'realestate_tax':realestate_tax, 'insurance_invoice':insurance_invoice, 'raTaxFilter':raTaxFilter, 'realestate_sum':realestate_sum}
return render(request, 'billing/utilities.html', context)
Это первая часть шаблона:
{% extends 'main.html' %}
{% load static %}
{% block title %} Utilities Bill {% endblock %}
{% block content %}
<img src="{% static 'media/bojack.png' %}" style="width:100px">
<h1>Nebenkostenabrechnung</h1>
<br>
<div class="container">
<div class="row">
<form class="form-group" method="get">
{{raTaxFilter.form}}
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
Что я пробовал до сих пор:
- Ввод значения int | --> кверисет не изменяется .
- Ввод даты | -->
Field 'None' expected a number but got datetime.date(2011, 1, 1).
.
- пробовал с выражениями поиска :
year
,year__gte
,year__gt
| --> не сработало .
- Пробовал фильтр непосредственно в представлении
realestate_tax = realestate_tax.filter(start_of_period__year__gte=2011)
| --> это работает, но тогда это без модуля django-filter и мне придется собирать все вручную .
Заранее большое спасибо. Надеюсь, вы сможете мне помочь.
Ваш billing_year
- это не DateFilter
, а NumberFilter
. Действительно, год - это целое число, а не дата. Таким образом, это означает, что мы можем фильтровать с заданным числом (например, 2011) по году этой даты:
class InvoiceFilter(django_filters.FilterSet):
billing_year = NumberFilter(
label='Abrechnungsjahr',
field_name='start_of_period',
lookup_expr='year__gt'
)
class Meta:
model = RealEstateTax
fields = ['realestate_id', 'billing_year']