Home > database >  django swagger api returned object url instead of readable name
django swagger api returned object url instead of readable name

Time:09-14

I have an model which is for mapping book(item) to categories(tag), it shows like this in the django admin page.

id      item_uid     tag_uid
407     Food         Recipe

but in django swagger page, when I try to GET this mapping api with ID 407, it returned like this:

"id": 407,
"item_uid": "http://127.0.0.1:8000/items/237/";
"tag_uid": "http://127.0.0.1:8000/tags/361/"

as you can see, it mapped together correctly, but the response body showed the object url and it's object id, which is not readable for human users. I wonder that if there is anyway to make them like this:

"id": 407,
"item_uid": "Food";
"tag_uid": "Recipe"

edit: codes,

#models.py
class Map_item_tag(models.Model):
 item_uid = models.ForeignKey(items, on_delete=models.CASCADE, verbose_name='Item UID')
 tag_uid = models.ForeignKey(tags, on_delete=models.CASCADE, verbose_name='Tag UID')

#admin.py
@admin.register(Map_item_tag)
class map_item_tag_admin(ImportExportModelAdmin):
 resource_class = map_item_tag_Resource
 readonly_fields = ('id',)
 list_display = ['id','item_uid','tag_uid']

#serializers.py
class Map_item_tag_Serializer(serializers.HyperlinkedModelSerializer):
     class Meta:
         model = Map_item_tag
         fields = ['id','item_uid','tag_uid']

#views.py
class Map_item_tag_ViewSet(viewsets.ModelViewSet):
    
    queryset = Map_item_tag.objects.all().order_by('item_uid')
    serializer_class = Map_item_tag_Serializer
    parser_classes = (FormParser, MultiPartParser)
    permission_classes = [permissions.IsAuthenticated]

thank you for answering!

CodePudding user response:

It seems you are using a HyperlinkedModelSerializer instead of a regular ModelSerializer

Try changing the serializer class to a ModelSerializer:

class ItemSerializer(serializers.ModelSerializer):
     class Meta:
         model = Item
         fields = [] # list of fields you want to include in your Item serializer

class Map_item_tag_Serializer(serializers.ModelSerializer):
     item_uid = ItemSerializer()
     class Meta:
         model = Map_item_tag
         fields = ['id','item_uid','tag_uid']

In addition, I would advise you to use CamelCase notation for all your classes. For example: instead of using Map_item_tag_Serializer, change the name to MapItemTagSerializer. The same goes for all your other classes.

I would also avoid using using the _uuid suffix when using ForeignKey relationships. In the MapItemTag model, the ForeignKey relationship inherently means that the field will point to an object Item of Tag object. Hence, no need to specify the _uuid part again.

For example, the following changes would make the model a lot more readable:

class MapItemTag(models.Model):
 item = models.ForeignKey(Item, on_delete=models.CASCADE, verbose_name='map_item')
 tag = models.ForeignKey(Tag, on_delete=models.CASCADE, verbose_name='map_tag')
  • Related