@@ -230,9 +230,7 @@ def get_url(self, obj):
230230 "pk" : lookup_value ,
231231 "custom_object_type" : obj .custom_object_type .name .lower (),
232232 }
233- request = self .context .get ("request" )
234- if not request :
235- return None
233+ request = self .context ["request" ]
236234 format = self .context .get ("format" )
237235 return reverse (view_name , kwargs = kwargs , request = request , format = format )
238236
@@ -250,83 +248,12 @@ def get_display(self, obj):
250248 "get_display" : get_display ,
251249 }
252250
253- # Add custom fields using the proper field types
254251 for field in model_fields :
252+ field_type = field_types .FIELD_TYPE_CLASS [field .type ]()
255253 try :
256- field_type = field_types .FIELD_TYPE_CLASS [field .type ]()
257- serializer_field = field_type .get_serializer_field (field )
258-
259- # Handle hyperlinked fields that might cause issues
260- if hasattr (serializer_field , 'view_name' ):
261- # Check if the view_name is empty or problematic
262- if not getattr (serializer_field , 'view_name' , None ):
263- # Replace with a safer field type
264- if field .type in ['object' , 'multiobject' ]:
265- # Use PrimaryKeyRelatedField for object fields
266- if hasattr (field , 'related_object_type' ) and field .related_object_type :
267- try :
268- model_class = field .related_object_type .model_class ()
269- if field .type == 'multiobject' :
270- attrs [field .name ] = serializers .PrimaryKeyRelatedField (
271- queryset = model_class .objects .all (),
272- many = True ,
273- allow_null = True ,
274- required = not field .required
275- )
276- else :
277- attrs [field .name ] = serializers .PrimaryKeyRelatedField (
278- queryset = model_class .objects .all (),
279- allow_null = True ,
280- required = not field .required
281- )
282- except Exception :
283- # Fallback to read-only PK field
284- attrs [field .name ] = serializers .PrimaryKeyRelatedField (read_only = True )
285- else :
286- attrs [field .name ] = serializers .PrimaryKeyRelatedField (read_only = True )
287- else :
288- attrs [field .name ] = serializer_field
289- else :
290- attrs [field .name ] = serializer_field
291- else :
292- attrs [field .name ] = serializer_field
293-
254+ attrs [field .name ] = field_type .get_serializer_field (field )
294255 except NotImplementedError :
295256 print (f"serializer: { field .name } field is not implemented; using a default serializer field" )
296- # Create a basic field based on type
297- if field .type in ['text' , 'longtext' , 'url' ]:
298- attrs [field .name ] = serializers .CharField (
299- required = field .required ,
300- allow_blank = not field .required ,
301- max_length = 255 if field .type == 'text' else None
302- )
303- elif field .type == 'integer' :
304- attrs [field .name ] = serializers .IntegerField (required = field .required )
305- elif field .type == 'decimal' :
306- attrs [field .name ] = serializers .DecimalField (
307- required = field .required ,
308- max_digits = 10 ,
309- decimal_places = 2
310- )
311- elif field .type == 'boolean' :
312- attrs [field .name ] = serializers .BooleanField (required = field .required )
313- elif field .type == 'date' :
314- attrs [field .name ] = serializers .DateField (required = field .required )
315- elif field .type == 'datetime' :
316- attrs [field .name ] = serializers .DateTimeField (required = field .required )
317- else :
318- attrs [field .name ] = serializers .CharField (
319- required = field .required ,
320- allow_blank = not field .required
321- )
322- except Exception as e :
323- print (f"serializer: Error creating field { field .name } : { e } " )
324- # Safe fallback
325- attrs [field .name ] = serializers .CharField (
326- required = False ,
327- allow_blank = True ,
328- read_only = True
329- )
330257
331258 serializer_name = f"{ model ._meta .object_name } Serializer"
332259 serializer = type (
@@ -339,11 +266,4 @@ def get_display(self, obj):
339266 current_module = sys .modules [__name__ ]
340267 setattr (current_module , serializer_name , serializer )
341268
342- '''
343- # Also add to __all__ so it's properly exported
344- global __all__
345- if serializer_name not in __all__:
346- __all__ = __all__ + (serializer_name,)
347- '''
348-
349269 return serializer
0 commit comments