Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django rest框架序列化多对多字段_Python_Django_Django Models_Django Rest Framework_Django Serializer - Fatal编程技术网

Python Django rest框架序列化多对多字段

Python Django rest框架序列化多对多字段,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,如何将多对多字段序列化到某个内容的列表中,并通过rest框架返回它们?在我下面的示例中,我尝试返回文章以及与之相关联的标签列表 型号.py class post(models.Model): tag = models.ManyToManyField(Tag) text = models.CharField(max_length=100) class PostSerializer(serializers.ModelSerializer): class Meta:

如何将多对多字段序列化到某个内容的列表中,并通过rest框架返回它们?在我下面的示例中,我尝试返回文章以及与之相关联的标签列表

型号.py

class post(models.Model):
    tag = models.ManyToManyField(Tag)
    text = models.CharField(max_length=100)
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ("text", "tag"??)
class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
序列化程序.py

class post(models.Model):
    tag = models.ManyToManyField(Tag)
    text = models.CharField(max_length=100)
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ("text", "tag"??)
class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
视图.py

class post(models.Model):
    tag = models.ManyToManyField(Tag)
    text = models.CharField(max_length=100)
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ("text", "tag"??)
class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

您需要一个
TagSerializer
,它的
class Meta
具有
model=Tag
。创建
TagSerializer
后,使用
many=True
修改
PostSerializer
中的
ManyToManyField
关系:

class PostSerializer(serializers.ModelSerializer):
    tag = TagSerializer(read_only=True, many=True)

    class Meta:
        model = Post
        fields = ('tag', 'text',)
这对我很有用

tag = TagSerializer(source="tag", read_only=True, many=True)

init方法上的序列化程序中,您可以将queryset传递给字段,并在rest_框架中验证该queryset上的id

1) 首先从serializers.ModelSerializer扩展序列化程序

class YourSerializer(serializers.ModelSerializer):
2) 在元类中包含字段

class YourSerializer(serializers.ModelSerializer):
  class Meta:
        fields = (..., 'your_field',)
3) 在init方法中:

def __init__(self, *args, **kwargs):
    super(YourSerializer, self).__init__(*args, **kwargs)
    self.fields['your_field].queryset = <the queryset of your field>
def\uuuu init\uuuu(self,*args,**kwargs):
super(您的序列化程序,self)。\uuuuu初始化(*args,**kwargs)
self.fields['your_field].queryset=
您可以像通常一样使用filter或exclude在任何参数下限制该字段的queryset。如果希望包含所有,只需使用.objects.all()

Django 2.0

对于多对多字段,如果需要特定字段:

class QuestionSerializer(serializers.ModelSerializer):

    topics_list = serializers.SerializerMethodField()

    def get_topics_list(self, instance):
        names = []
        a = instance.topics.get_queryset()
        for i in a:
            names.append(i.desc)
        return names
    class Meta:
        model = Question
        fields = ('topics_list',)

我就是这么做的,假设一本书可以有多个作者,一个作者可以有多本书: 关于型号:

class Author(models.Model):
    name = models.CharField(max_length=100, default="")
    last_name = models.IntegerField(default=0)

class Book(models.Model):
    authors = models.ManyToManyField(Author, related_name="book_list", blank=True)
    name = models.CharField(max_length=100, default="")
    published = models.BooleanField(default=True)
在序列化程序上:

class BookSerializer(serializers.ModelSerializer):
    authors = serializers.PrimaryKeyRelatedField(queryset=Author.objects.all(), many=True)

    class Meta:
        model = Book
        fields = ('id', 'name', 'published', 'authors')


class AuthorSerializer(serializers.ModelSerializer):
    book_list = BookSerializer(many=True, read_only=True)

    class Meta:
        model = Author
        fields = ('id', 'name', 'last_name', 'book_list')
添加到@Brian的答案中 “tags”:[{“name”:“tag1”}]可以简化为“tags”:[“tag1”、“tag2”、…]如下:

class PostSerializer(serializers.ModelSerializer):
    tag = TagSerializer(read_only=True, many=True)

    class Meta:
        ...

class TagSerializer(serializers.RelatedField):

     def to_representation(self, value):
         return value.name

     class Meta:
        model = Tag

此处的详细信息:

默认的
ModelSerializer
将主键用于关系。但是,您可以使用
Meta
depth
属性轻松生成嵌套表示:

类后序列化程序(serializers.ModelSerializer):
类元:
型号=员额
字段=(“文本”、“标记”)
深度=1
如报告中所述:

depth
选项应设置为一个整数值,该整数值指示在恢复为平面表示之前应遍历的关系的深度


它起作用了!!!:我知道如何把这个序列化程序变成一个逗号分隔的列表吗?类TagSerializer(serializers.ModelSerializer):类Meta:model=tagfields=('name')现在,我得到:“tags”:[{“name”:“tag1”}]我想把它简化为:“tags”:[“tag1”、“tag2”,…]tags=serializers.ListField(source='Tag')。这将为您提供每个标记对象的str表示列表。如果您想通过Post更新标记,该怎么办?(例如,不只读)当我删除只读并尝试修补标记字段的更新时,我会有奇怪的行为(我得到一个关于标记已经存在的错误)
read\u only=True
部分在这里解释:使用@Brian的帮助,我设法以这种形式列出项目:“标记”:[{“name”:“tag1”}。我想将其简化为列表,是否可以:“tags”:[“tag1”,“tag2”,…]使用`tags=serializers.SlugRelatedField(many=True,read\u only=True,slug\u field='title',//tag's fireld您想显示allow\u null=True)`在PostSerializerAny idea中,我们如何在创建图书实体时创建作者?是的,必须在Views类中完成,如果您想要更详细地回答
get\u topics\u list
的问题,请发布另一个问题,您可以简化为
返回列表(instance.topics.values\u list('desc',flat=True))