Как показать значения данных внешнего ключа вместо урлов в Django api?

У меня есть следующие коды в models.py

class Tag(models.Model):
    name = models.CharField(max_length=40)

    def __str__(self):
        return self.name

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
    likes = models.IntegerField()
    popularity = models.FloatField()
    reads = models.IntegerField()
    tags = models.ManyToManyField(Tag)

class User(models.Model):
    name = models.CharField(max_length=40)
    
    def __str__(self):
        return self.name

но в localhost:8000/posts, я обнаружил нечто странное: эти внешние ключи отображаются как url, например

{
        "url": "http://127.0.0.1:8000/posts/1/",
        "likes": 3,
        "popularity": 0.25,
        "reads": 59,
        "author": "http://127.0.0.1:8000/users/1/",
        "tags": [
            "http://127.0.0.1:8000/tags/1/",
            "http://127.0.0.1:8000/tags/2/"
        ]
    }

В таком случае, как я могу изменить отображаемый api на что-то вроде "author":"Any Name" и "tags": ["tag1","tag2"]?

Вы можете использовать ModelSerializer с SerializerMethodField

class YourSerializer(serializers.ModelSerializer):
  author = serializers.SerializerMethodField("get_author")
  tags = serializers.SerializerMethodField("get_tags")

  class Meta:
    model = YourModel
    fields = (YourModelFields, "author", "tags")

  def get_author(self,obj):
    return obj.author.name

  def get_tags(self, obj):
    return obj.tags.all().values("name")
Вернуться на верх