如何将我的结果缩小至1%的用户?

时间:2019-01-31 18:31:25

标签: django django-models django-templates django-views

我有以下代码,该代码从用户检索合同并以升序或降序返回。这将显示每个用户每个合同。我只在寻找最后一个或第一个合同,如何将每个用户的查询结果限制为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的位置显示最后一份合同的日期。我有更多地方需要使用它,但是这个地方最容易显示。

1 个答案:

答案 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 %}