在前端(React组件)显示值,该值是django模型中的外键。

0 人关注

我正在学习django rest框架。我想在JSON中获得作者的全名,而不是ID,下面是 GET request ,如果有的话,有办法吗?从管理站点创建了 Articles 。我试图用 article.author 在前台获得该值。

"id": 1, "article_title": "Premier League", "description": "The Premier League is the top level of the English football league system. Contested by 20 clubs, it operates on a system of promotion and relegation with the English Football League. The Premier League is a corporation in which the member clubs act as shareholders.", "created_at": "2019-10-02T08:59:24.883450Z", "author": 1 "id": 2, "article_title": "Cricket in England", "description": "Cricket is one of the most popular sports in England, and has been played since the 16th century. Marylebone Cricket Club, based at Lord's, developed the modern rules of play and conduct.", "created_at": "2019-10-02T08:59:57.075912Z", "author": 2

反应组件的渲染功能。 article.author_id 显示空白, article.author_id 显示作者 id integer 。我应该返回什么来显示作者的全名?

render() {
    return (
        <Fragment>
            <h2>Articles</h2>
                    this.props.articles.map(article => (
                        <div className="card" key={article.id}>
                            <div className="card-body">
                                <div className="card-title"> <b>{article.article_title}</b></div>
                                <div className="card-text"> {article.description}</div>
                                <div> Author: {article.author_id}</div>
                                <div className="card-footer text-muted"> Created date: {article.created_at}</div>
                            <br></br>
        </Fragment>

应用程序的模型类,包含字段

#model class
from django.db import models
class Author(models.Model):
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)
class Articles(models.Model):
    article_title = models.CharField(max_length=100, unique=True)
    description = models.TextField(max_length=500)
    created_at = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, blank=True)
    def __str__(self):enter code here
        return self.article_title
from rest_framework import serializers
from .models import Lead, Author, Articles
# Author Serializer
class AuthorSerializer(serializers.ModelSerializer):
  class Meta:
    model = Author
    fields = '__all__'
#Article serializer
class ArticleSerializer(serializers.ModelSerializer):
  class Meta:
    model = Articles
    fields = '__all__'

包含Viewset的API类,用于查看api调用。

from .models import Author,Articles
from rest_framework import viewsets, permissions
from .serializers import  AuthorSerializer, ArticleSerializer
#Author Viewset
class AuthorViewset(viewsets.ModelViewSet):
    permission_classes = [permissions.AllowAny]
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer
#Article Viewset
class ArticlesViewset(viewsets.ModelViewSet):
    permission_classes = [permissions.AllowAny]
    queryset = Articles.objects.all()
    serializer_class = ArticleSerializer
    
python
django
reactjs
django-rest-framework
Prathamesh Patil
Prathamesh Patil
发布于 2019-10-04
2 个回答
hancho
hancho
发布于 2019-10-04
已采纳
0 人赞同

你可以把全名连接起来,注释到查询集上,然后把它添加到序列化器中。

from django.db.models import F, Value
class ArticlesViewset(viewsets.ModelViewSet):
    permission_classes = [permissions.AllowAny]
    queryset = Articles.objects.all()
    serializer_class = ArticleSerializer
    def get_queryset(self):
        return self.queryset.annotate(
            authors_name=Concat('author__first_name', Value(" "), 'author__last_name')
class ArticleSerializer(serializers.ModelSerializer):
    authors_name = serializers.CharField(required=False)
    class Meta:
        model = Articles
        fields = ('article_title', 'description', 'created_at', 'authors_name')
    
在ArticleSerializer类中添加了 "author = serializers.CharField(required=False)",它起到了作用。感谢帮助 @hancho
Prathamesh Patil
Prathamesh Patil
发布于 2019-10-04
0 人赞同

我在序列化器类中做了以下改动,我能够得到作者的名字了

#Article serializer
class ArticleSerializer(serializers.ModelSerializer):