#35050 closed Bug (fixed)
Issue filtering on FilteredRelation with F object
Reported by: | Mark Zorn | Owned by: | David Wobrock |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 5.0 |
Severity: | Release blocker | Keywords: | FilteredRelation |
Cc: | Francesco Panico, David Wobrock | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
I just started trying to upgrade an existing project from Django 4.2.8 to Django 5 and ran across the following issue.
I have two classes:
class DashboardSuggestion(BaseModel): active = models.BooleanField(default=True) title = models.CharField(max_length=50) body = models.CharField(max_length=80) max_dismissals = models.IntegerField(default=1) days_between_dismissals = models.IntegerField(null=True, blank=True) objects = DashboardSuggestionQuerySet.as_manager() class Meta: db_table = 'dashboard_suggestion'
class DashboardSuggestionDismiss(BaseModel): suggestion = models.ForeignKey('suggestions.DashboardSuggestion', on_delete=models.CASCADE, related_name='dismissals') user = models.ForeignKey('users.User', on_delete=models.SET_NULL, null=True, blank=True) company = models.ForeignKey('companies.Company', on_delete=models.SET_NULL, null=True, blank=True) count = models.IntegerField(default=1) class Meta: db_table = 'dashboard_suggestion_dismiss' unique_together = ['user', 'suggestion', 'company']
And the following QuerySet:
class DashboardSuggestionQuerySet(models.QuerySet): def for_dashboard(self, user, company): queryset = self.annotate( is_dismissed=FilteredRelation( 'dismissals', condition=( Q(dismissals__user=user) & Q(dismissals__company=company) & ( Q(dismissals__count__gte=F('max_dismissals')) | Q(dismissals__updated__gt=timezone.now() - timezone.timedelta(days=1) * F('days_between_dismissals')) ) ) ), ).filter( Q(is_dismissed__isnull=True), )
When I attempt to call DashboardSuggestion.objects.for_dashboard(user, company)
I receive the following error:
Cannot resolve keyword 'days_between_is_dismissed' into field. Choices are...
The string days_between_is_dismissed
does not exist anywhere in my code. I do not see where it is being used or generated at all.
Trying to do a bit of debugging, somehow the F('days_between_dismissals')
in the FilteredRelation condition is getting converted to F(days_between_is_dismissed)
but I have not yet found the exact place that is happening.
This code was working as I expected in Django 4.2.
Please let me know if I can supply any additional information.
Change History (7)
comment:1 by , 12 months ago
Description: | modified (diff) |
---|
comment:2 by , 12 months ago
Description: | modified (diff) |
---|
comment:3 by , 12 months ago
Cc: | added |
---|---|
Component: | Uncategorized → Database layer (models, ORM) |
Triage Stage: | Unreviewed → Accepted |
comment:4 by , 12 months ago
Cc: | added |
---|---|
Has patch: | set |
Owner: | changed from | to
Status: | new → assigned |
comment:5 by , 12 months ago
Triage Stage: | Accepted → Ready for checkin |
---|
Thanks for the report!
Regression in 59f475470494ce5b8cbff816b1e5dafcbd10a3a3.