#33590: Related object is not resolved
----------------------------------+--------------------------------------
Reporter: Stefan de Konink | Owner: nobody
Type: Bug | Status: new
Component: Uncategorized | Version: 4.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------+--------------------------------------
Description changed by Stefan de Konink:
Old description:
> I have the following setup; two managed models, and an unmanaged model
> which is a facade for a view in PostgreSQL. I can reduce the issue to
> only the unmanaged table with ordinary integer fields.
>
> {{{
> class NextSchedule(models.Model):
> scheduled = models.DateTimeField(blank=False, null=False,
> verbose_name=_('at'))
> exact_schedule_id = models.IntegerField(null=False)
> negative_schedule_id = models.IntegerField(null=True)
>
> class Meta:
> managed = False
> }}}
>
> My practical issue is that I am unable to get negative_schedule_id to be
> shown up. It is worse: when I explicitly query only a column with this
> value the queryset is empty.
>
> {{{
> blxa=> SELECT "blxadmin_nextschedule"."id",
> "blxadmin_nextschedule"."scheduled",
> "blxadmin_nextschedule"."exact_schedule_id",
> "blxadmin_nextschedule"."negative_schedule_id" FROM
> "blxadmin_nextschedule";
> id | scheduled | exact_schedule_id | negative_schedule_id
> ----+---------------------+-------------------+----------------------
> 7 | 2022-03-21 01:00:00 | 1 | 1
> (1 row)
> }}}
>
> {{{
> >>> NextSchedule.objects.all()
> <QuerySet []>
> }}}
>
> The crazy thing is, if the to_time of the negative schedule is increased
> over one hour, it will give a result. Mind you: we are still talking
> about an unrelated IntegerField, where as the query from PostgreSQL
> returns the same values.
>
> {{{
> >>> NextSchedule.objects.all()
> <QuerySet [<NextSchedule: NextSchedule object (7)>]>
> }}}
>
> So what about the view? The most simple view I can break it with is
> below, absolutely no fancy stuff other than a left join.
> {{{
> blxa=> create view blxadmin_nextschedule as select row_number() over
> (order by scheduled) as id, scheduled, exact_schedule_id, v.id as
> negative_schedule_id from (select '2022-03-21'::date + '01:00:00'::time
> as scheduled, 1 as exact_schedule_id) as u left join
> blxadmin_negativeschedule as v on (u.scheduled between v.from_datetime
> and v.to_datetime) order by scheduled asc;
> CREATE VIEW
> blxa=> SELECT "blxadmin_nextschedule"."id",
> "blxadmin_nextschedule"."scheduled",
> "blxadmin_nextschedule"."exact_schedule_id",
> "blxadmin_nextschedule"."negative_schedule_id" FROM
> "blxadmin_nextschedule";
> id | scheduled | exact_schedule_id | negative_schedule_id
> ----+---------------------+-------------------+----------------------
> 1 | 2022-03-21 01:00:00 | 1 | 1
> (1 row)
> }}}
>
> Empty result.
> {{{
> NextSchedule.objects.get(id=1).negative_schedule_id
> }}}
>
> The model to reproduce it with simplified;
> {{{
> class NegativeSchedule(models.Model):
> from_datetime = models.DateTimeField(blank=False, null=False)
> to_datetime = models.DateTimeField(blank=False, null=False)
> }}}
>
> Date range that it does not work with:
> 21-03-2022 01:00:00 - 21-03-2022 01:59:59
>
> Date range that it shows up with a value:
> 21-03-2022 01:00:00 - 21-03-2022 02:00:00
New description:
I have the following setup; two managed models, and an unmanaged model
which is a facade for a view in PostgreSQL. I can reduce the issue to only
the unmanaged table with ordinary integer fields.
{{{
class NextSchedule(models.Model):
scheduled = models.DateTimeField(blank=False, null=False,
verbose_name=_('at'))
exact_schedule_id = models.IntegerField(null=False)
negative_schedule_id = models.IntegerField(null=True)
class Meta:
managed = False
}}}
My practical issue is that I am unable to get negative_schedule_id to be
shown up. It is worse: when I explicitly query only a column with this
value the queryset is empty.
{{{
blxa=> SELECT "blxadmin_nextschedule"."id",
"blxadmin_nextschedule"."scheduled",
"blxadmin_nextschedule"."exact_schedule_id",
"blxadmin_nextschedule"."negative_schedule_id" FROM
"blxadmin_nextschedule";
id | scheduled | exact_schedule_id | negative_schedule_id
----+---------------------+-------------------+----------------------
7 | 2022-03-21 01:00:00 | 1 | 1
(1 row)
}}}
{{{
>>> NextSchedule.objects.all()
<QuerySet []>
}}}
The crazy thing is, if the to_time of the negative schedule is increased
over one hour, it will give a result. Mind you: we are still talking about
an unrelated IntegerField, where as the query from PostgreSQL returns the
same values.
{{{
>>> NextSchedule.objects.all()
<QuerySet [<NextSchedule: NextSchedule object (7)>]>
}}}
So what about the view? The most simple view I can break it with is below,
absolutely no fancy stuff other than a left join.
{{{
blxa=> create view blxadmin_nextschedule as select row_number() over
(order by scheduled) as id, scheduled, exact_schedule_id, v.id as
negative_schedule_id from (select '2022-03-21'::date + '01:00:00'::time as
scheduled, 1 as exact_schedule_id) as u left join
blxadmin_negativeschedule as v on (u.scheduled between v.from_datetime and
v.to_datetime) order by scheduled asc;
CREATE VIEW
blxa=> SELECT "blxadmin_nextschedule"."id",
"blxadmin_nextschedule"."scheduled",
"blxadmin_nextschedule"."exact_schedule_id",
"blxadmin_nextschedule"."negative_schedule_id" FROM
"blxadmin_nextschedule";
id | scheduled | exact_schedule_id | negative_schedule_id
----+---------------------+-------------------+----------------------
1 | 2022-03-21 01:00:00 | 1 | 1
(1 row)
}}}
Empty result.
{{{
NextSchedule.objects.get(id=1).negative_schedule_id
}}}
The model to reproduce it with simplified;
{{{
class NegativeSchedule(models.Model):
from_datetime = models.DateTimeField(blank=False, null=False)
to_datetime = models.DateTimeField(blank=False, null=False)
}}}
Date range that it does not work with:
21-03-2022 01:00:00 - 21-03-2022 01:59:59
Date range that it shows up with a value:
21-03-2022 01:00:00 - 21-03-2022 02:00:00
When the view is changed to have a coalesce, the coalesce value appears in
the ORM.
{{{
blxa=> create view blxadmin_nextschedule as select row_number() over
(order by scheduled) as id, scheduled, exact_schedule_id, coalesce(v.id,
0) as negative_schedule_id from (select '2022-03-21'::date +
'01:00:00'::time as scheduled, 1 as exact_schedule_id) as u left join
blxadmin_negativeschedule as v on (u.scheduled between v.from_datetime and
v.to_datetime) order by scheduled asc;
CREATE VIEW
blxa=> select * from blxadmin_nextschedule ;
id | scheduled | exact_schedule_id | negative_schedule_id
----+---------------------+-------------------+----------------------
1 | 2022-03-21 01:00:00 | 1 | 1
(1 row)
}}}
{{{
>>> NextSchedule.objects.all()[0].scheduled,
NextSchedule.objects.all()[0].exact_schedule_id,
NextSchedule.objects.get(id=1).negative_schedule_id
(datetime.datetime(2022, 3, 21, 1, 0), 1, 0)
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/33590#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/0107017fa985b26d-3b19e8dc-b332-44ac-af29-6b5c1064a9cc-000000%40eu-central-1.amazonses.com.