Django serializer как сериализовать поле внешнего ключа

Это мой models.py

class AuthorModel(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    host = models.CharField(max_length=200, default=settings.HOST_URL)
    displayName = models.CharField(max_length=200)
    github = models.CharField(max_length=200)
    profileImage = models.CharField(max_length=200)

class PostModel(models.Model):
    title = models.CharField(max_length=200)
    id = models.CharField(max_length=200, primary_key=True)
    source = models.CharField(max_length=200, blank=True)
    origin = models.CharField(max_length=200, blank=True)
    description = models.CharField(max_length=200)
    contentType = models.CharField(max_length=200)
    content = models.CharField(max_length=2000)
    author = models.ForeignKey(AuthorModel, related_name=("post"), on_delete=models.CASCADE, null=True)
    categories = models.CharField(max_length=200)
    count = models.IntegerField(blank=True, null=True)
    comments = models.CharField(max_length=200, blank=True)
    published = models.DateTimeField(auto_now=True)
    visibility = models.CharField(max_length=200)
    unlisted = models.BooleanField()

Это мой views.py

@api_view(['POST'])
def create_post(request):
    """
    Create a new Post
    """
    if request.method == 'POST':
        serializer = PostSerializer(data=request.data)
        print("api received request data:    ",request.data)
        if serializer.is_valid(raise_exception=True):
            author_object = AuthorModel.objects.get(id=request.data['author'])
            serializer.author = author_object
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Это мой serializers.py

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthorModel
        fields = ['id', 'host', 'displayName', 'github', 'profileImage']

class PostSerializer(serializers.ModelSerializer):
    author = AuthorSerializer(many=True, read_only=True)
    class Meta:
        # TODO commentsSrc
        model = PostModel
        fields = ['title', 'id', 'source', 'origin', 'description', 'contentType','content','author','categories','count','comments','published','visibility','unlisted']

и, наконец, мой html

{% extends 'base.html' %}

{% block title %} Create Post {% endblock %}

{% block content %}
<div class="card" style="margin:10px">
    <h2 style="margin: 10px 10px 0">Create A New Post</h2>
    <form action="{% url 'createpost' %}" method="post" id="post_form">
    {% csrf_token %}
    <div class="mb-3">
    <label for="title">Title: </label>
    <input id="title" type="text" name="title" value="{{ title }}">
    </div>
    <div class="mb-3">
    <label for="description">Description: </label>
    <input id="description" type="text" name="description" value="{{ description }}">
    </div>
    <div class="mb-3">
    <label for="contentType">ContentType: </label>
    <input id="contentType" type="text" name="contentType" value="{{ contentType }}">
    </div>
    <div class="mb-3">
    <label for="content">Content: </label>
    <textarea id="content" type="text" name="content" form="post_form" value="{{ content }}"></textarea>
    </div>
    <div class="mb-3">
    <label for="categories">Categories: </label>
    <input id="categories" type="text" name="categories" value="{{ categories }}">
    </div>
    <div class="mb-3">
    <label for="visibility">Visibility: </label>
    <input id="visibility" type="radio" name="visibility" value="PUBLIC">PUBLIC
    <input id="visibility" type="radio" name="visibility" value="FRIEND">FRIEND ONLY
    </div>
    <div class="mb-3">
    <label for="unlisted">Unlisted: </label>
    <input id="unlisted" type="checkbox" name="unlisted">
    </div>
    <div class="mb-3">
        <input id="id" type="text" name="id" value="{{UUID}}">
    </div>
    <div class="mb-3">
        <input id="author" type="text" name="author" value={{user.authormodel.id}}>
    </div> 
    <div class="mb-3">
        <input id="source" type="hidden" name="source" value={{user.authormodel.host|add:'posts/'|add:UUID}}>
    </div> 
    <div class="mb-3">
        <input id="origin" type="hidden" name="origin" value={{user.authormodel.host|add:'posts/'|add:UUID}}>
    </div>
    <input type="hidden" name="next" value="{{ request.path }}">
    <div class="mb-3">
    <input type="submit" value="Submit">
    </div>
    </form>
</div>
{% endblock %}

Я хотел бы сериализовать мою PostModel так, чтобы она показывала что-то вроде

{
  title:'title',
  ...
  author:{
    id:"someid",
    host:"host name",
    ...
  },
  categories:"cat",
  ...
}

Но я никогда не заставлял свою базу данных сохранять автора, в базе данных должен быть сохранен мой текущий автор, но он всегда null. На самом деле я могу получить текущего пользователя в шаблоне, и когда у меня есть {{user.authormodel.id}}, он может правильно вывести id. Похоже, что мой сериализатор не сериализовал автора. Что я должен изменить, чтобы это заработало? Заранее спасибо за ответ.

Вернуться на верх