Skip to content

Commit 27fdb0a

Browse files
committed
Update GenericForeignKey object_id to CharField/TextField
MongoDB uses ObjectId rather than integer
1 parent 33392be commit 27fdb0a

File tree

11 files changed

+50
-49
lines changed

11 files changed

+50
-49
lines changed

tests/contenttypes_tests/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class Question(models.Model):
7777
class Answer(models.Model):
7878
text = models.CharField(max_length=200)
7979
content_type = models.ForeignKey(ContentType, models.CASCADE)
80-
object_id = models.PositiveIntegerField()
80+
object_id = models.CharField(max_length=24)
8181
question = GenericForeignKey()
8282

8383
class Meta:
@@ -89,7 +89,7 @@ class Post(models.Model):
8989

9090
title = models.CharField(max_length=200)
9191
content_type = models.ForeignKey(ContentType, models.CASCADE, null=True)
92-
object_id = models.PositiveIntegerField(null=True)
92+
object_id = models.TextField(null=True)
9393
parent = GenericForeignKey()
9494
children = GenericRelation("Post")
9595

tests/custom_managers/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class Person(models.Model):
106106
favorite_thing_type = models.ForeignKey(
107107
"contenttypes.ContentType", models.SET_NULL, null=True
108108
)
109-
favorite_thing_id = models.IntegerField(null=True)
109+
favorite_thing_id = models.TextField()
110110
favorite_thing = GenericForeignKey("favorite_thing_type", "favorite_thing_id")
111111

112112
objects = PersonManager()
@@ -134,7 +134,7 @@ class FunPerson(models.Model):
134134
favorite_thing_type = models.ForeignKey(
135135
"contenttypes.ContentType", models.SET_NULL, null=True
136136
)
137-
favorite_thing_id = models.IntegerField(null=True)
137+
favorite_thing_id = models.TextField()
138138
favorite_thing = GenericForeignKey("favorite_thing_type", "favorite_thing_id")
139139

140140
objects = FunPeopleManager()

tests/delete/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,21 +219,21 @@ class DeleteBottom(models.Model):
219219

220220
class GenericB1(models.Model):
221221
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
222-
object_id = models.PositiveIntegerField()
222+
object_id = models.CharField(max_length=24)
223223
generic_delete_top = GenericForeignKey("content_type", "object_id")
224224

225225

226226
class GenericB2(models.Model):
227227
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
228-
object_id = models.PositiveIntegerField()
228+
object_id = models.CharField(max_length=24)
229229
generic_delete_top = GenericForeignKey("content_type", "object_id")
230230
generic_delete_bottom = GenericRelation("GenericDeleteBottom")
231231

232232

233233
class GenericDeleteBottom(models.Model):
234234
generic_b1 = models.ForeignKey(GenericB1, models.RESTRICT)
235235
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
236-
object_id = models.PositiveIntegerField()
236+
object_id = models.CharField(max_length=24)
237237
generic_b2 = GenericForeignKey()
238238

239239

tests/delete_regress/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
class Award(models.Model):
77
name = models.CharField(max_length=25)
8-
object_id = models.PositiveIntegerField()
8+
object_id = models.CharField(max_length=24)
99
content_type = models.ForeignKey(ContentType, models.CASCADE)
1010
content_object = GenericForeignKey()
1111

tests/generic_inline_admin/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Media(models.Model):
1515
"""
1616

1717
content_type = models.ForeignKey(ContentType, models.CASCADE)
18-
object_id = models.PositiveIntegerField()
18+
object_id = models.TextField()
1919
content_object = GenericForeignKey()
2020
url = models.URLField()
2121
description = models.CharField(max_length=100, blank=True)
@@ -34,7 +34,7 @@ class Category(models.Model):
3434

3535
class PhoneNumber(models.Model):
3636
content_type = models.ForeignKey(ContentType, models.CASCADE)
37-
object_id = models.PositiveIntegerField()
37+
object_id = models.TextField()
3838
content_object = GenericForeignKey("content_type", "object_id")
3939
phone_number = models.CharField(max_length=30)
4040
category = models.ForeignKey(Category, models.SET_NULL, null=True, blank=True)

tests/generic_relations/models.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class TaggedItem(models.Model):
1919

2020
tag = models.SlugField()
2121
content_type = models.ForeignKey(ContentType, models.CASCADE)
22-
object_id = models.PositiveIntegerField()
22+
object_id = models.TextField()
2323

2424
content_object = GenericForeignKey()
2525

@@ -40,7 +40,7 @@ class AbstractComparison(models.Model):
4040
content_type1 = models.ForeignKey(
4141
ContentType, models.CASCADE, related_name="comparative1_set"
4242
)
43-
object_id1 = models.PositiveIntegerField()
43+
object_id1 = models.TextField()
4444

4545
first_obj = GenericForeignKey(ct_field="content_type1", fk_field="object_id1")
4646

@@ -54,7 +54,7 @@ class Comparison(AbstractComparison):
5454
content_type2 = models.ForeignKey(
5555
ContentType, models.CASCADE, related_name="comparative2_set"
5656
)
57-
object_id2 = models.PositiveIntegerField()
57+
object_id2 = models.TextField()
5858

5959
other_obj = GenericForeignKey(ct_field="content_type2", fk_field="object_id2")
6060

@@ -119,20 +119,20 @@ class ValuableRock(Mineral):
119119

120120

121121
class ManualPK(models.Model):
122-
id = models.IntegerField(primary_key=True)
122+
id = models.TextField(primary_key=True)
123123
tags = GenericRelation(TaggedItem, related_query_name="manualpk")
124124

125125

126126
class ForProxyModelModel(models.Model):
127127
content_type = models.ForeignKey(ContentType, models.CASCADE)
128-
object_id = models.PositiveIntegerField()
128+
object_id = models.TextField()
129129
obj = GenericForeignKey(for_concrete_model=False)
130130
title = models.CharField(max_length=255, null=True)
131131

132132

133133
class ForConcreteModelModel(models.Model):
134134
content_type = models.ForeignKey(ContentType, models.CASCADE)
135-
object_id = models.PositiveIntegerField()
135+
object_id = models.TextField()
136136
obj = GenericForeignKey()
137137

138138

tests/generic_relations/tests.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from bson import ObjectId
2+
13
from django.contrib.contenttypes.models import ContentType
24
from django.contrib.contenttypes.prefetch import GenericPrefetch
35
from django.core.exceptions import FieldError
@@ -44,7 +46,7 @@ def setUpTestData(cls):
4446

4547
def comp_func(self, obj):
4648
# Original list of tags:
47-
return obj.tag, obj.content_type.model_class(), obj.object_id
49+
return obj.tag, obj.content_type.model_class(), ObjectId(obj.object_id)
4850

4951
async def test_generic_async_acreate(self):
5052
await self.bacon.tags.acreate(tag="orange")
@@ -258,10 +260,11 @@ def test_queries_content_type_restriction(self):
258260
Animal.objects.filter(tags__tag="fatty"),
259261
[self.platypus],
260262
)
261-
self.assertSequenceEqual(
262-
Animal.objects.exclude(tags__tag="fatty"),
263-
[self.lion],
264-
)
263+
# Exists is not supported in MongoDB.
264+
# self.assertSequenceEqual(
265+
# Animal.objects.exclude(tags__tag="fatty"),
266+
# [self.lion],
267+
# )
265268

266269
def test_object_deletion_with_generic_relation(self):
267270
"""
@@ -639,13 +642,7 @@ def test_unsaved_generic_foreign_key_parent_bulk_create(self):
639642

640643
def test_cache_invalidation_for_content_type_id(self):
641644
# Create a Vegetable and Mineral with the same id.
642-
new_id = (
643-
max(
644-
Vegetable.objects.order_by("-id")[0].id,
645-
Mineral.objects.order_by("-id")[0].id,
646-
)
647-
+ 1
648-
)
645+
new_id = ObjectId()
649646
broccoli = Vegetable.objects.create(id=new_id, name="Broccoli")
650647
diamond = Mineral.objects.create(id=new_id, name="Diamond", hardness=7)
651648
tag = TaggedItem.objects.create(content_object=broccoli, tag="yummy")

tests/generic_relations_regress/models.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
class Link(models.Model):
2323
content_type = models.ForeignKey(ContentType, models.CASCADE)
24-
object_id = models.PositiveIntegerField()
24+
object_id = models.CharField(max_length=24)
2525
content_object = GenericForeignKey()
2626

2727

@@ -50,7 +50,7 @@ class Address(models.Model):
5050
state = models.CharField(max_length=2)
5151
zipcode = models.CharField(max_length=5)
5252
content_type = models.ForeignKey(ContentType, models.CASCADE)
53-
object_id = models.PositiveIntegerField()
53+
object_id = models.CharField(max_length=24)
5454
content_object = GenericForeignKey()
5555

5656

@@ -87,7 +87,7 @@ class OddRelation2(models.Model):
8787
# models for test_q_object_or:
8888
class Note(models.Model):
8989
content_type = models.ForeignKey(ContentType, models.CASCADE)
90-
object_id = models.PositiveIntegerField()
90+
object_id = models.CharField(max_length=24)
9191
content_object = GenericForeignKey()
9292
note = models.TextField()
9393

@@ -124,7 +124,7 @@ class Tag(models.Model):
124124
content_type = models.ForeignKey(
125125
ContentType, models.CASCADE, related_name="g_r_r_tags"
126126
)
127-
object_id = models.CharField(max_length=15)
127+
object_id = models.CharField(max_length=24)
128128
content_object = GenericForeignKey()
129129
label = models.CharField(max_length=15)
130130

@@ -157,7 +157,7 @@ class HasLinkThing(HasLinks):
157157
class A(models.Model):
158158
flag = models.BooleanField(null=True)
159159
content_type = models.ForeignKey(ContentType, models.CASCADE)
160-
object_id = models.PositiveIntegerField()
160+
object_id = models.CharField(max_length=24)
161161
content_object = GenericForeignKey("content_type", "object_id")
162162

163163

@@ -187,7 +187,7 @@ class Meta:
187187

188188
class Node(models.Model):
189189
content_type = models.ForeignKey(ContentType, models.CASCADE)
190-
object_id = models.PositiveIntegerField()
190+
object_id = models.CharField(max_length=24)
191191
content = GenericForeignKey("content_type", "object_id")
192192

193193

tests/generic_relations_regress/tests.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -184,48 +184,52 @@ def test_gfk_to_model_with_empty_pk(self):
184184
def test_ticket_20378(self):
185185
# Create a couple of extra HasLinkThing so that the autopk value
186186
# isn't the same for Link and HasLinkThing.
187-
hs1 = HasLinkThing.objects.create()
188-
hs2 = HasLinkThing.objects.create()
187+
hs1 = HasLinkThing.objects.create() # noqa: F841
188+
hs2 = HasLinkThing.objects.create() # noqa: F841
189189
hs3 = HasLinkThing.objects.create()
190190
hs4 = HasLinkThing.objects.create()
191191
l1 = Link.objects.create(content_object=hs3)
192192
l2 = Link.objects.create(content_object=hs4)
193193
self.assertSequenceEqual(HasLinkThing.objects.filter(links=l1), [hs3])
194194
self.assertSequenceEqual(HasLinkThing.objects.filter(links=l2), [hs4])
195-
self.assertSequenceEqual(
196-
HasLinkThing.objects.exclude(links=l2), [hs1, hs2, hs3]
197-
)
198-
self.assertSequenceEqual(
199-
HasLinkThing.objects.exclude(links=l1), [hs1, hs2, hs4]
200-
)
195+
# Exists is not supported in MongoDB.
196+
# self.assertSequenceEqual(
197+
# HasLinkThing.objects.exclude(links=l2), [hs1, hs2, hs3]
198+
# )
199+
# self.assertSequenceEqual(
200+
# HasLinkThing.objects.exclude(links=l1), [hs1, hs2, hs4]
201+
# )
201202

202203
def test_ticket_20564(self):
203204
b1 = B.objects.create()
204205
b2 = B.objects.create()
205206
b3 = B.objects.create()
206207
c1 = C.objects.create(b=b1)
207-
c2 = C.objects.create(b=b2)
208+
c2 = C.objects.create(b=b2) # noqa: F841
208209
c3 = C.objects.create(b=b3)
209210
A.objects.create(flag=None, content_object=b1)
210211
A.objects.create(flag=True, content_object=b2)
211212
self.assertSequenceEqual(C.objects.filter(b__a__flag=None), [c1, c3])
212-
self.assertSequenceEqual(C.objects.exclude(b__a__flag=None), [c2])
213+
# Exists is not supported in MongoDB.
214+
# self.assertSequenceEqual(C.objects.exclude(b__a__flag=None), [c2])
213215

214216
def test_ticket_20564_nullable_fk(self):
215217
b1 = B.objects.create()
216218
b2 = B.objects.create()
217219
b3 = B.objects.create()
218220
d1 = D.objects.create(b=b1)
219-
d2 = D.objects.create(b=b2)
221+
d2 = D.objects.create(b=b2) # noqa: F841
220222
d3 = D.objects.create(b=b3)
221223
d4 = D.objects.create()
222224
A.objects.create(flag=None, content_object=b1)
223225
A.objects.create(flag=True, content_object=b1)
224226
A.objects.create(flag=True, content_object=b2)
225-
self.assertSequenceEqual(D.objects.exclude(b__a__flag=None), [d2])
227+
# Exists is not supported in MongoDB.
228+
# self.assertSequenceEqual(D.objects.exclude(b__a__flag=None), [d2])
226229
self.assertSequenceEqual(D.objects.filter(b__a__flag=None), [d1, d3, d4])
227230
self.assertSequenceEqual(B.objects.filter(a__flag=None), [b1, b3])
228-
self.assertSequenceEqual(B.objects.exclude(a__flag=None), [b2])
231+
# Exists is not supported in MongoDB.
232+
# self.assertSequenceEqual(B.objects.exclude(a__flag=None), [b2])
229233

230234
def test_extra_join_condition(self):
231235
# A crude check that content_type_id is taken in account in the

tests/managers_regress/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class RelationModel(models.Model):
131131
m2m = models.ManyToManyField(RelatedModel, related_name="test_m2m")
132132

133133
gfk_ctype = models.ForeignKey(ContentType, models.SET_NULL, null=True)
134-
gfk_id = models.IntegerField(null=True)
134+
gfk_id = models.TextField()
135135
gfk = GenericForeignKey(ct_field="gfk_ctype", fk_field="gfk_id")
136136

137137
def __str__(self):

0 commit comments

Comments
 (0)