我有以下代码,该代码从用户检索合同并以升序或降序返回。这将显示每个用户每个合同。我只在寻找最后一个或第一个合同,如何将每个用户的查询结果限制为1个?
first_contract = Contract.objects.select_related('user').order_by('contract_start')
last_contract = Contract.objects.select_related('user').order_by('-contract_start')
型号:
class Contract(models.Model):
user = models.ForeignKey(User, on_delete = models.CASCADE)
contract_start = models.DateField(null = True, blank = True)
contract_end = models.DateField(null = True, blank = True)
将[:1]放在最后不是我想要的,这只会给我1个用户的1个结果。
编辑:
我的观点:
def get(self, request):
users = User.objects.all().exclude(is_superuser=True)
user_contracts = User.objects.annotate(first_contract=Min('contracts__contract_start'), last_contract=Max('contracts__contract_start'))
return render(request, 'user/list_all.html', {
'users': users,
'user_contracts': user_contracts,
})
我的模板:
{% for user in users %}
<tr>
<td>{{ user.employee.number }}</td>
<td>{{ user.last_name }}</td>
<td>{{ user.first_name }}</td>
<td>{{ user.employee.location }}</td>
<td>{{ contract_start }}</td>
<td>{{ contract_end }}</td>
</tr>
{% endfor %}
应在其中显示contract_start和contract_end的位置显示最后一份合同的日期。我有更多地方需要使用它,但是这个地方最容易显示。
答案 0 :(得分:0)
如果只需要第一个合同或最后一个合同,您可以使用它。
class Contract(models.Model):
user = models.ForeignKey(User, on_delete = models.CASCADE, related_name='contracts')
contract_start = models.DateField(null = True, blank = True)
contract_end = models.DateField(null = True, blank = True)
查看
def get(self, request):
user_contracts = User.objects.exclude(is_superuser=True).annotate(first_contract=Min('contracts__contract_start'), last_contract=Max('contracts__contract_start'))
return render(request, 'user/list_all.html', {
'user_contracts': user_contracts,
})
在模板中
{% for user in user_contracts %}
<tr>
<td>{{ user.employee.number }}</td>
<td>{{ user.last_name }}</td>
<td>{{ user.first_name }}</td>
<td>{{ user.employee.location }}</td>
<td>{{ user.contract_start }}</td>
<td>{{ user.contract_end }}</td>
</tr>
{% endfor %}