Django ORM - Функция поиска по нескольким моделям
Я изо всех сил пытаюсь заставить свою функцию поиска собирать результаты из нескольких моделей в одну таблицу.
У меня есть модель персон и модель дат:
class Person(models.Model):
personid = models.AutoField()
name = models.CharField()
etc....
class Dates(models.Model):
datesid = models.AutoField()
personid = models.ForeignKey(Person, models.DO_NOTHING)
date_type = models.CharField()
date = models.CharField()
etc....
На одно personid будет приходиться несколько дат (от многих до одной), что я пытаюсь сделать, так это вернуть самую новую дату из Dates, когда выполняется поиск по модели Person - вид ниже:
def search(request):
if request.method == "POST":
searched = request.POST.get('searched')
stripsearched = searched.strip()
results = Person.objects.filter(
Q(searchterm1__icontains=stripsearched) |
Q(searchterm12__icontains=stripsearched) |
Q(searchterm3__contains=stripsearched)
).values('personid', 'name', 'address_1', 'address_2', 'address_3', 'code', 'number')
Как мне добавить в него Топ-1 самых новых связанных дат Dates.date для каждого человека, найденного в поле "результаты"?
Вид:
{% for Person in results %}
<tr>
<td>{{ Person.name }}</a></td>
<td >{{ Person.address_1 }}</td>
<td >{{ Person.code }}</td>
</tr>
{% endfor %}
Я бы попробовал использовать функцию annotate.
Следуя вашей функции поиска, модифицированной для добавления максимальной или минимальной даты для данного человека
def search(request):
if request.method == "POST":
searched = request.POST.get('searched')
stripsearched = searched.strip()
results = Person.objects.filter(
Q(searchterm1__icontains=stripsearched) |
Q(searchterm12__icontains=stripsearched) |
Q(searchterm3__contains=stripsearched)
).annotate(min_date=Min('Dates__date'), max_date=Max('Dates__date')
).values('personid', 'name', 'address_1', 'address_2', 'address_3', 'code', 'number', 'min_date', 'max_date')
Это добавит в список результатов 2 новых поля min_date и max_date для каждого человека, так что вы можете использовать это в своем шаблоне
{% for Person in results %}
<tr>
<td>{{ Person.name }}</a></td>
<td >{{ Person.address_1 }}</td>
<td >{{ Person.code }}</td>
<td >{{ Person.min_date }}</td>
<td >{{ Person.max_date }}</td>
</tr>
{% endfor %}