Список пользователей, с большим количеством данных об этих пользователях.Как добавить последнюю запись из таблицы «один ко многим» в этот список для каждого пользователя? - PullRequest
0 голосов
/ 01 февраля 2019

Моя проблема:

У каждого пользователя несколько контрактов (у некоторых 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):
  users = User.objects.all().exclude(is_superuser=True)
  return render(request, 'user/list_all.html', {
        'users': users,
    }) 

Шаблон:

{% 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 %}

Я занимаюсь этим уже целый день, но не могу решить эту проблему.Я не могу использовать Different () , так как я использую MySQL.Я пытался использовать annotate , но я либо получаю набор запросов для каждого пользователя, в то время как у некоторых нет контрактов, либо я получаю одинаковую дату контракта для каждого пользователя.

1 Ответ

0 голосов
/ 01 февраля 2019

Как я понял, вы хотите получить самую высокую дату начала, которая означает самую последнюю дату Контракта

, поэтому сначала нам нужно получить Контракты каждого пользователя

, а затем нам нужно отфильтровать Контракты на основепоследнее поле contract_start, возможно, не лучшее решение, но то, что я мог бы получить

View

def get(self, request):
  users = User.objects.all().exclude(is_superuser=True)
  data = {}
  for user in users:
    user_contracts = Contract.objects.filter(user=user)
     # edit: to make sure it will not throw matching query does not exist error
    if len(user_contracts ) > 0: 
        user_latest = user_contracts.latest('contract_start')
        data[user] =  user_latest
    else:
        data[user] = ''

  return render(request, 'user/list_all.html', {
        'data': data,
    }) 

Шаблон:


{% for user, contract in data.items %}
  <tr>
    <td>{{ user.employee.number }}</td>
    <td>{{ user.last_name }}</td>
    <td>{{ user.first_name }}</td>
    <td>{{ user.employee.location }}</td>

    <td>{{ contract.contract_start  }}</td>
    <td>{{ contract.contract_end }}</td>

  </tr>
{% endfor %}

latest Возвращает последний объект втаблица на основе заданных полей.https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

...