【问题标题】:How to get Model Choice Field name instead of id in template using django rest framework如何使用 django rest 框架在模板中获取模型选择字段名称而不是 id
【发布时间】:2017-01-04 20:04:04
【问题描述】:

我在模板中获得了选择字段的 ID。但我希望显示选择字段的名称。请查看以下文件并告诉我如何获取名称。

这是我的models.py

================================================ ================

class Posted(models.Model):
    name = models.CharField(_('Posted In'),max_length=255, unique=True)

class Tags(models.Model):
    name = models.CharField(_('Tag Name'),max_length=255, unique=True)

class Blogs(models.Model):
    author = models.ForeignKey(CustomUser)
    title=models.CharField(max_length=100)
    posted=models.ForeignKey(Posted, blank=True)
    tags= models.ManyToManyField(Tags, blank=True)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

序列化器.py


class BlogsSerializer(serializers.ModelSerializer):
    author = AccountSerializer(read_only=True,required=False)
    class Meta:
        model = Blogs
        fields = ('id','author','title','tags','posted','content','created_at','updated_at')
        read_only_fields=('id','created_at','updated_at')

class TagsSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()   
    class Meta:
        model = Tags 
        fields = ('id','name')
        read_only_fields=('id','name')
class PostedSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()
    class Meta:
        model = Posted
        fields = ('id','name')
        read_only_fields=('id','name')

views.py


class BlogViewSet(viewsets.ModelViewSet):
    queryset=Blogs.objects.order_by('-created_at')
    serializer_class= BlogsSerializer

    def get_permissions(self):
        if self.request.method in permissions.SAFE_METHODS:
            return (permissions.AllowAny(),)
        return (permissions.IsAuthenticated(),IsAuthorOfBlog(),)

    def perform_create(self,serializer):
        serializer.save(author=self.request.user)

        return super(BlogViewSet,self).perform_create(serializer)

class TagsViewSet(viewsets.ModelViewSet):
    queryset=Tags.objects.all
    serializer_class= TagsSerializer

class PostedViewSet(viewsets.ModelViewSet):
    queryset=Posted.objects.all
    serializer_class= PostedSerializer

模板

<div class="row">
  <div class="col-sm-12">
    <div class="well">
      <div class="blog">
        <div class="blog__meta">
          <a href="#">
            +{{ blog.author.first_name }}
          </a>
        </div>

        <div class="blog__content">
          <p>{{ blog.title }}</p>
          <p>{{ blog.posted}}</p>
          <p>{{ blog.tags}}</p>
          <p>{{ blog.content }}</p>

        </div>
      </div>
    </div>
  </div>
</div>

提前致谢

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你所说的选择是什么意思?我在 Field kwargs 中看不到 choices。您可以通过例如设置选择字段: chairs = models.IntegerField(max_length=255, choices=CHOICES) 你到底从哪里得到 id 而不是 name ?

    【讨论】:

    • 选项来自两个表。发布和标记 .modelchoicefields
    • 我重新创建了你的环境,这就是我完成的:在你的 BlogsSerializer 添加你的序列化程序,这会给你正确的 json 输出:class BlogsSerializer(serializers.ModelSerializer): posted = PostedSerializer() tags = TagsSerializer(many=True) 请注意,因为标签是多对多的关系,我们需要传递 kwarg many=True 并作为未来提示 - 在您的情况下尝试为模型使用单数名称,它将是 BlogTag 等。
    【解决方案2】:

    您可以使用SlugRelatedField 选项将特定字段作为关系对象返回。例如,

    class BlogsSerializer(serializers.ModelSerializer):
    author = AccountSerializer(read_only=True,required=False)
    tags = serializers.SlugRelatedField(
        many=True,
        read_only=True,
        slug_field='name'
     )
    class Meta:
        model = Blogs
        fields = ('id','author','title','tags','posted','content','created_at','updated_at')
        read_only_fields=('id','created_at','updated_at')
    

    【讨论】:

      【解决方案3】:

      感谢@Karol Sztajerwald。 是的,BlogsSerializer 必须这样制作。

      最终博客 Serializer.py 是

      class TagsSerializer(serializers.ModelSerializer):
          class Meta:
              model = Tags
      
              fields = ('id','name')
              read_only_fields=('id','name')
      
      class PostedSerializer(serializers.ModelSerializer):
          class Meta:
              model = Posted
      
              fields = ('id','name')
              read_only_fields=('id','name')
      class BlogsSerializer(serializers.ModelSerializer):
          author = AccountSerializer(read_only=True,required=False)
          tags=TagsSerializer(many=True)
          posted=PostedSerializer()
          class Meta:
              model = Blogs
      
              fields = ('id','author','title','tags','posted','content','created_at','updated_at')
              read_only_fields=('id','created_at','updated_at')
      

      模板是

      <p>{{ blog.title }}</p>
      <p>{{ blog.posted.name}}</p>
      <p>{{ blog.tags.name}}</p>
      <p>{{ blog.content }}</p>
      

      【讨论】:

        猜你喜欢
        • 2019-02-28
        • 1970-01-01
        • 2020-05-16
        • 2016-03-26
        • 1970-01-01
        • 2011-03-10
        • 2020-08-06
        • 2015-01-17
        • 1970-01-01
        相关资源
        最近更新 更多