【问题标题】:Serialize a foreingkey and many to many fields in DRF序列化 DRF 中的外键和多对多字段
【发布时间】:2015-09-16 18:51:32
【问题描述】:

我有这样的模型:

class Category(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField(unique=True, max_length=255, blank=True,default=None)
    desc = models.TextField(blank=True, null=True )

    ...

class Post(models.Model):
   title = models.CharField(max_length=255)
   pub_date = models.DateTimeField(editable=False,blank=True)
   author = models.ForeignKey(User, null=True, blank=True)
   categories = models.ManyToManyField(Category, blank=True, through='CatToPost')

   ...


class CatToPost(models.Model):
    post = models.ForeignKey(Post)
    category = models.ForeignKey(Category)

    ...

这是序列化程序:

 class CategorySerializer(serializers.ModelSerializer):
   class Meta:
        model = Category
        fields = ('name','slug')

class PostSerializer(serializers.ModelSerializer):
    categories = CategorySerializer(many=True, required=True)


    class Meta:
        model = Post
        .......

views.py

class SingleListing(generics.RetrieveUpdateDestroyAPIView):
    queryset = Post.objects.all()
    serializer_class =Post

序列化器

但这不会在网络浏览视图中显示类别字段。我只看到Category 标签,但是这个字段的输入字段不存在。问题是什么?

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    DRF 将不支持 many=True 并且上升这个 Lists are not currently supported in HTML input. Category 不是一个领域它是一个模型。它将显示所有与模型相关的字段。

    试试这个:

    serializers.py

    class PostSerializer(serializers.ModelSerializer):
        categories = CategorySerializer(required=True)
    
    
        class Meta:
            model = Post
            fields = ('id', 'title', 'pub_date', 'author', 'categories')
    

    views.py

    class SingleViewSet(viewsets.ModelViewSet):
        queryset = Post.objects.all()
        serializer_class = PostSerializer
    

    在网络浏览器视图中显示字段

    【讨论】:

    • 但是为什么类别字段不填充类别模型中的数据并显示为下拉字段,就像在管理员中一样?
    • 我提到 DRF 将不支持 ManyToMany 像下拉菜单一样显示。
    • 有什么办法可以做到吗?
    【解决方案2】:

    好吧,你应该这样写你的序列化器:

    class CategorySerializer(serializers.ModelSerializer):
          class Meta:
                model = Category
                fields = ('name','slug')
    
    class PostSerializer(serializers.ModelSerializer):
    
          class Meta:
                model = Post  
                fields = ('id','{anything you want}','categories')
                depth = 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多