Opened 4 years ago
Closed 4 years ago
#33614 closed Bug (invalid)
Django's object creation when using GenericForeignKeys results in different ContentType model id's
| Reported by: | Lucas Zocco | Owned by: | nobody |
|---|---|---|---|
| Component: | contrib.contenttypes | Version: | 4.0 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
I've created a Document model that has a GenericFK to another model, however I have noticed that the related_type id is different depending on how the object is created. It seems to be wrong if done in the manner explained in the official documentation (https://docs.djangoproject.com/en/4.0/ref/contrib/contenttypes/#generic-relations-1) where the object is directly assigned to related_object instead of creating the GenericForeignKey by setting the related_type and related_id individually.
A small code snippet to illustrate:
class Document(BaseModel):
related_id = models.UUIDField(
null=True,
blank=True,
db_index=True,
help_text=("The UUID of the origin model, which this flag came from."),
)
related_type = models.ForeignKey(
ContentType,
null=True,
blank=True,
on_delete=models.SET_NULL,
help_text="Type that the Subject id relates to",
)
related = GenericForeignKey("related_type", "related_id")
doc1 = Document(data=b'',
related=company)
doc2 = Document(data=b'',
related_type=ContentType.objects.get_for_model(company),
related_id=company.id)
print(ContentType.objects.get_for_model(company).id)
>>> 23
print(doc1.related_type.id)
>>> 148
print(doc2.related_type.id)
>>> 23
For reference: There's no object with id 148 in the ContentTypes table so I'm not sure where it's getting it from.
I unfortunately cannot reproduce your reported issue on the latest version of Django with your provided instructions (Defining a
Companymodel of my own with no fields).Please re-open with a set of instructions that reproduces against a supported version of Django (e.g. a sample project with a command or test case that demonstrates an assertion failure).