File tree Expand file tree Collapse file tree 4 files changed +35
-1
lines changed Expand file tree Collapse file tree 4 files changed +35
-1
lines changed Original file line number Diff line number Diff line change 83
83
defer
84
84
defer_regress
85
85
from_db_value
86
+ generic_relations
86
87
introspection
87
88
known_related_objects
88
89
lookup
Original file line number Diff line number Diff line change @@ -79,6 +79,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
79
79
"many_to_one.tests.ManyToOneTests.test_selects" ,
80
80
# Incorrect JOIN with GenericRelation gives incorrect results.
81
81
"aggregation_regress.tests.AggregationTests.test_aggregation_with_generic_reverse_relation" ,
82
+ "generic_relations.tests.GenericRelationsTests.test_queries_content_type_restriction" ,
82
83
# subclasses of BaseDatabaseWrapper may require an is_usable() method
83
84
"backends.tests.BackendTestCase.test_is_usable_after_database_disconnects" ,
84
85
# Connection creation doesn't follow the usual Django API.
@@ -247,6 +248,7 @@ def django_test_expected_failures(self):
247
248
},
248
249
"Test assumes integer primary key." : {
249
250
"db_functions.comparison.test_cast.CastTests.test_cast_to_integer_foreign_key" ,
251
+ "generic_relations.tests.GenericRelationsTests.test_cache_invalidation_for_content_type_id" ,
250
252
"model_fields.test_foreignkey.ForeignKeyTests.test_to_python" ,
251
253
"queries.test_qs_combinators.QuerySetSetOperationTests.test_order_raises_on_non_selected_column" ,
252
254
},
Original file line number Diff line number Diff line change 1
1
from .auto import ObjectIdAutoField
2
2
from .duration import register_duration_field
3
3
from .json import register_json_field
4
+ from .object_id import ObjectIdField
4
5
5
- __all__ = ["register_fields" , "ObjectIdAutoField" ]
6
+ __all__ = ["register_fields" , "ObjectIdAutoField" , "ObjectIdField" ]
6
7
7
8
8
9
def register_fields ():
Original file line number Diff line number Diff line change
1
+ from bson import ObjectId , errors
2
+ from django .db .models .fields import Field
3
+ from django .utils .translation import gettext_lazy as _
4
+
5
+
6
+ class ObjectIdField (Field ):
7
+ description = _ ("Object Id" )
8
+
9
+ def get_internal_type (self ):
10
+ return "ObjectIdField"
11
+
12
+ def db_type (self , connection ):
13
+ return "ObjectId"
14
+
15
+ def get_prep_value (self , value ):
16
+ value = super ().get_prep_value (value )
17
+ return self .to_python (value )
18
+
19
+ def to_python (self , value ):
20
+ if value is None :
21
+ return value
22
+ if isinstance (value , ObjectId | int ):
23
+ return value
24
+ try :
25
+ return ObjectId (value )
26
+ except errors .InvalidId as e :
27
+ # A manually assigned integer ID?
28
+ if isinstance (value , str ) and value .isdigit ():
29
+ return int (value )
30
+ raise ValueError (f"Field '{ self .name } ' expected an ObjectId but got { value !r} ." ) from e
You can’t perform that action at this time.
0 commit comments