我在我的项目中使用了PostgreSQL,并且有三个相关的模型:
class Timer(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
task = models.ForeignKey(
Task,
models.CASCADE,
related_name="timers",
)
class Task(models.Model):
name = models.CharField(max_length=64)
wanted_duration = models.DurationField()
frequency = models.ForeignKey(
Frequency,
models.CASCADE,
related_name="tasks",
)
class Frequency(models.Model):
class TimeUnitChoices(models.TextChoices):
DAY = "day", "day"
WEEK = "week", "week"
MONTH = "month", "month"
QUARTER = "quarter", "quarter"
YEAR = "year", "year"
events_number = models.PositiveIntegerField()
time_unit = models.CharField(max_length=32, choices=TimeUnitChoices.choices
)
我想得到一个开始的时间跨度(天,周-一个频率的值time_unit)根据start日期(计时器的字段).
我try 执行下一个代码:task.timers.annotate(start_of=Trunc('start', kind='task__frequency__time_unit'))
但是Django不接受Trunc类的kind参数中的字段.错误:psycopg.ProgrammingError: cannot adapt type 'F' using placeholder '%t' (format: TEXT)
如果我在原始SQL中执行以下查询:
SELECT
DATE_TRUNC(schedules_frequency.time_unit, timers_timer.start)::date as start_of
FROM public.tasks_task
INNER JOIN public.schedules_frequency ON tasks_task.frequency_id = schedules_frequency.id
INNER JOIN public.timers_timer ON timers_timer.task_id = tasks_task.id;
一切都如你所愿.在Django项目中是否有不直接使用原始SQL的解决方案?