Opened 104 minutes ago

Last modified 100 minutes ago

#37024 assigned Cleanup/optimization

Integer SITE_ID check incorrect when a different primary key type is used

Reported by: Tim Graham Owned by: Tim Graham
Component: contrib.sites Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

To catch a programmer mistake where the SITE_ID setting is defined with an incorrect type (e.g. SITE_ID = "1"), #31802 added a system check that only allows SITE_ID to be an int or None. This forces third-party databases with non-integer primary keys like MongoDB (which uses ObjectId) to silence this check.

It would be more appropriate if this check performed the validation based on Site._meta.pk rather than with hardcoded types.

I thought of a few options:

  1. Use Site._meta.pk.to_python(settings.SITE_ID) to validate the SITE_ID, relying on it to raise ValidationError for unexpected types. This won't work because AutoField.to_python() accepts strings that coerce to integer which are values the original fix was intended to reject.
  1. Use Site._meta.pk.to_python(settings.SITE_ID) but also check if settings.SITE_ID != Site._meta.pk.to_python(settings.SITE_ID). This would catch invalid values that to_python() coerces to the correct type.
  1. Add Field.expected_type which could be int, ObjectId, or whatever. The implementation of the check could continue to use isinstance(). The downside is that adding a new attribute to the Field API would be non-trivial.

I've implemented option #2.

Change History (1)

comment:1 by Tim Graham, 100 minutes ago

Has patch: set
Note: See TracTickets for help on using tickets.
Back to Top