Django ORM - 跨多个模型的搜索功能
Django ORM - Search Function Across Multiple Models
我正在努力让我的搜索功能将多个模型的结果整合到一个 table。
我有一个人物模型和一个日期模型:
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 将有多个日期(多对一),我想做的是 return 对 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 %}
我正在努力让我的搜索功能将多个模型的结果整合到一个 table。
我有一个人物模型和一个日期模型:
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 将有多个日期(多对一),我想做的是 return 对 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 %}