【问题标题】:Using foreign key attributes in Angular template在 Angular 模板中使用外键属性
【发布时间】:2018-02-23 02:36:35
【问题描述】:

我使用 Django 作为后端(Django Rest Framework),使用 Angular 作为前端。在后端,我有 2 个模型:

class Post(models.Model):
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    content = models.TextField(max_length=1000)

class Category(models.Model):
    title = models.CharField(max_length=120)

我相应地序列化:

class CategorySerializer(ModelSerializer):

    class Meta:
        model   = Category
        fields = '__all__'

class PostSerializer(ModelSerializer):

    class Meta:
        model   = Post
        fields = '__all__'

然后在组件模板中我要打印特定帖子的类别标题:

<li *ngFor='let post of posts'>
  <div *ngIf='post'>
    <p>{{ post.category.title }}</p>
    <p>{{ post.content }}</p>
  </div>
</li>

我的课程是:

export class Post {
  id: number;
  category: Category;
  content: string;
}

export class Category {
  id: number;
  title: string;
}

为什么{{ post.category.title }} 不起作用,而{{ post.content }} 起作用?这是我的序列化问题还是我的 Angular 类的问题?

编辑:API 视图:

class PostListCreateAPIView(ListCreateAPIView):
    queryset            = Post.objects.all()
    serializer_class    = PostSerializer

【问题讨论】:

    标签: django angular django-rest-framework


    【解决方案1】:

    创建一个新的序列化程序RetrivePostSerializer

    使用CategorySerializer 序列化RetrivePostSerializer 中的相关字段category

    class RetrivePostSerializer(ModelSerializer):
        category = CategorySerializer(read_only=True)
    
        class Meta:
            model   = Post
            fields = ('id', 'category', 'content')
    

    对 GET 和 POST 使用不同的序列化程序,覆盖 get_serializer_class 方法

    class PostListCreateAPIView(ListCreateAPIView):
        queryset = Post.objects.all()
    
        def get_serializer_class(self):
           if self.request.method == 'POST':
              return PostSerializer
           return RetrivePostSerializer
    

    您的PostSerializer 将与之前一样

    class PostSerializer(ModelSerializer):
    
        class Meta:
            model   = Post
            fields = '__all__'
    

    【讨论】:

    • 我试过了,但是在我的 PostCreateAPIView(可浏览 API)中,它要求我也发布一个新类别,这会导致错误:
    • 更新了我的答案,将read_only=True 添加到 CategorySerializer 构造函数
    • 好吧,这也是我的第一个动作。但这会导致为我创建的每个新帖子添加 category=null。
    • 您需要使用两个不同的序列化器,一个用于创建,另一个用于检索
    • 更新了我的答案,您需要创建一个新的序列化程序RetrivePostSerializer 并在您的视图中使用它
    猜你喜欢
    • 2023-04-09
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2019-02-27
    • 2013-07-10
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多