如何在 Django 中计算具有相同外键的两个查询集中不同字段之间的日期
How to calculate date between different fields in two querysets with same foreign key in Django
我正在使用 Django。
有没有办法在具有相同外键的查询集中的不同字段之间进行计数??!!
也就是我们要从injection_date中减去register_date。
您想获得 (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 %}
最后我得到一个空列表,但我知道,这是不正确的。我还在模板中使用了以下内容(没有查询集过滤器):
{% if list.created|date:'d m y h:i:s' == list.modified|date:'d m y h:i:s' %}
有效,但我更希望看到更优雅的解决方案。
这会让你所有的学生用他们的最大值 enroll_date 减去他们的最小值 injection_date 来注释。 min/max 用于删除学生可能出现的重复值
Student.objects.annotate(
injection_date=Min('feedback__injection_date'),
enroll_date=Max('feedback__enroll_date')
).annotate(
enroll_injection=F('enroll_date') - F('injection_date')
)
我正在使用 Django。 有没有办法在具有相同外键的查询集中的不同字段之间进行计数??!!
也就是我们要从injection_date中减去register_date。 您想获得 (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 %}
最后我得到一个空列表,但我知道,这是不正确的。我还在模板中使用了以下内容(没有查询集过滤器):
{% if list.created|date:'d m y h:i:s' == list.modified|date:'d m y h:i:s' %}
有效,但我更希望看到更优雅的解决方案。
这会让你所有的学生用他们的最大值 enroll_date 减去他们的最小值 injection_date 来注释。 min/max 用于删除学生可能出现的重复值
Student.objects.annotate(
injection_date=Min('feedback__injection_date'),
enroll_date=Max('feedback__enroll_date')
).annotate(
enroll_injection=F('enroll_date') - F('injection_date')
)