#15884 closed Bug (fixed)
Model validation allows nullable primary key field.
| Reported by: | JustinTArthur | Owned by: | JustinTArthur |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 1.3 |
| Severity: | Normal | Keywords: | |
| Cc: | julie@…, alexandrul | 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
If I have a primary key field that is also nullable, the model validation code is currently allowing it:
class MyModel(models.Model): other_model = OneToOneField(OtherModel, primary_key=True, null=True)
This behavior seems like a defect given two circumstances:
- No SQL implementation I know of allows a primary key column to be
NULLin the schema. - Django's
CASCADEdeletion willNone/NULLout anynull=Trueforeign keys (see source:/trunk/django/db/models/deletion.py@15927#L19),- While a SQL backend might correctly map the
Noneto a0instead ofNULLin theUPDATEstatement, after a second deletion against the same table, you would have more than one row with primary key of0, thus violating the uniqueness constraint intrinsic to a primary key field.
- While a SQL backend might correctly map the
Attachments (2)
Change History (9)
comment:1 by , 15 years ago
| Status: | new → assigned |
|---|
by , 15 years ago
| Attachment: | ticket_15884-patch_1.diff added |
|---|
Patch to add validation error when a model field is both a primary key and nullable.
comment:2 by , 15 years ago
| Component: | Uncategorized → Database layer (models, ORM) |
|---|---|
| Has patch: | set |
comment:3 by , 15 years ago
| Needs tests: | set |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
by , 14 years ago
| Attachment: | 15884.diff added |
|---|
comment:4 by , 14 years ago
| Cc: | added |
|---|---|
| Needs tests: | unset |
| UI/UX: | unset |
I'm attaching a patch with a test for the new validation behaviour -- the patch also includes JustinTArthur's diff as there was a missing double-quote around the field name.
comment:5 by , 14 years ago
| Cc: | added |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
Note:
See TracTickets
for help on using tickets.
The correct link for the
CASCADEinterest point is actually source:/django/trunk/django/db/models/deletion.py@15927#L19