Как вычислить дату между разными полями в двух наборах запросов с одинаковым внешним ключом в Django
Я использую Django. Есть ли способ подсчета между разными полями в наборе запросов с одним и тем же внешним ключом?!!!
То есть, мы хотим вычесть дату регистрации из даты инъекции. Вы хотите получить (2021-1-03) - (2021-10-31) = 3 дня.
injection_date | enroll_date | student_id (외래키) |
---|---|---|
2021-10-31 | 52 | |
2021-11-03 | 52 |
Ниже представлен код, который я написал на данный момент, как мне его исправить?! Пожалуйста, помогите. [models.py]
class Student(models.Model):
name = models.CharField(max_length=500, blank=True, null=True)
...
class Feedback(models.Model):
injection_date = models.DateField(blank=True, null=True)
enroll_date = models.DateField(blank=True, null=True)
student_id = models.ForeignKey(Student, on_delete=models.SET_NULL, null=True, blank=True)
[views.py]
injection_enroll = Feedback.objects\
.annotate(enroll_injection=F('enrolL_date') - F('injection_date'))
Попробуйте вот это:
from django.db.models import IntegerField, F
from django.db.models.functions import Cast, ExtractDay, TruncDate
injection_enroll = Feedback.objects.annotate(
enroll_injection=Cast(
ExtractDay(TruncDate(F('enrolL_date')) - TruncDate(F('injection_date'))),
IntegerField()
)
)
from django.db.models import F
my_list = todolist.objects.order_by('injection_date').filter(created__gte=F('enroll_date'))
Шаблон:
{% if my_list %}
{% for list in my_list %}
{{ list.text}}
{% endfor %}
{% else %}
<p>there is no list</p>
{% endif %}
В итоге я получаю пустой список, но я знаю, что это неправильно. Я также использовал следующее внутри шаблона (без фильтра queryset):
{% if list.created|date:'d m y h:i:s' == list.modified|date:'d m y h:i:s' %}
Это сработало, но я бы предпочел увидеть более элегантное решение.
В результате вы получите всех студентов, аннотированных с максимальной датой зачисления минус минимальная дата введения. Минимальное/максимальное значение служит для удаления дубликатов, которые могут встречаться для студента
Student.objects.annotate(
injection_date=Min('feedback__injection_date'),
enroll_date=Max('feedback__enroll_date')
).annotate(
enroll_injection=F('enroll_date') - F('injection_date')
)