带外键的序列化程序,如何处理前端视图和后端查询?

2024-06-01 12:43:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django Rest框架的新手,我试图了解如何处理前端视图和后端查询的序列化程序

我会尽量解释得更好。我有以下序列化程序:

    class AuthorSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('username', )
    
    
    class CategorySerializer(serializers.ModelSerializer):
        class Meta:
            model = Category
            fields = ('name', )
    
    
    class PostSerializer(serializers.ModelSerializer):
        author = AuthorSerializer(many=False, read_only=True)
        category = CategorySerializer(many=False, read_only=True)    
    
        class Meta:
            model = Post
            fields = ('category', 'id', 'title', 'image', 'slug', 'author', 'excerpt', 'content', 'status', 'published')

当我检索帖子时,它看起来如下所示:

    {
        "category": {
            "name": "django"
        },
        "id": 2,
        "title": "Learn Django - Class-Based Permission Checks",
        "image": "http://localhost:8000/media/posts/laptop_SWf7fkV.jpg",
        "slug": "learn-django-class-based-permission-checks",
        "author": {
            "username": "admin"
        },
        "excerpt": "Sed ut quam quis tellus pulvinar maximus. Nulla sodales, felis sed interdum lobortis, mi turpis dictum libero, at imperdiet justo eros a sem. Etiam et laoreet eros, quis gravida neque. Pellentesque vitae sollicitudin erat. Donec faucibus quis diam vitae pellentesque. Proin interdum justo vitae magna pretium egestas. Morbi tortor tortor, vestibulum a sagittis non, vestibulum at dolor. Etiam vulputate bibendum elit, id fermentum dui laoreet a. In ac porttitor lectus, eget tempor massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur imperdiet eu ipsum sit amet aliquet. Integer pharetra metus purus, a porttitor nunc bibendum eu. Aenean magna tellus, consectetur nec est vitae, placerat dapibus neque. Cras et venenatis mauris.",
        "content": "Sed ut quam quis tellus pulvinar maximus. Nulla sodales, felis sed interdum lobortis, mi turpis dictum libero, at imperdiet justo eros a sem. Etiam et laoreet eros, quis gravida neque. Pellentesque vitae sollicitudin erat. Donec faucibus quis diam vitae pellentesque. Proin interdum justo vitae magna pretium egestas. Morbi tortor tortor, vestibulum a sagittis non, vestibulum at dolor. Etiam vulputate bibendum elit, id fermentum dui laoreet a. In ac porttitor lectus, eget tempor massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur imperdiet eu ipsum sit amet aliquet. Integer pharetra metus purus, a porttitor nunc bibendum eu. Aenean magna tellus, consectetur nec est vitae, placerat dapibus neque. Cras et venenatis mauris.",
        "status": "published",
        "published": "2021-09-30T16:37:05.233816Z"
    }

由于在前端界面上显示数据非常完美,我可以很容易地获得类别名称和作者名称。 问题是当我必须将这些数据传递给“createnewpost”端点时。DB需要一个author和category的数字,但这样它就得到了一个对象,当然不起作用

如果我将PostSerializer序列化程序更改为:

 class PostSerializer(serializers.ModelSerializer):   
    
        class Meta:
            model = Post
            fields = ('category', 'id', 'title', 'image', 'slug', 'author', 'excerpt', 'content', 'status', 'published')

它可以工作,但是前端有问题

我该怎么做?我是否应该有两个不同的序列化程序,一个用于处理前端数据,另一个用于后端数据?还是有办法处理

谢谢

编辑:我将添加负责创建post端点的ModelViewSet。这可能有用

class ManagePosts(viewsets.ModelViewSet):
    serializer_class = PostSerializer
    parser_classes = [MultiPartParser, FormParser]

    def get_object(self, queryset=None, **kwargs):
        item = self.kwargs.get('pk')
        return get_object_or_404(Post, slug=item)

    # Define Custom Queryset
    def get_queryset(self):        
        return Post.objects.all()

Tags: 程序idfieldsmodel序列化metaclasset
2条回答

您可以在外键显示的字段列表中添加“id”字段

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username')


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

# Others serializers 

我不认为这是最好的方法,但它是有效的。我对后端调用使用了一个序列化程序,对前端调用使用了一个序列化程序。这样,我总是有正确的数据

class PostSerializer(serializers.ModelSerializer):
class Meta:
    model = Post
    fields = ('category', 'id', 'title', 'image', 'slug', 'author', 'excerpt', 'content', 'status', 'published')


class FrontendPostSerializer(serializers.ModelSerializer):
author = AuthorSerializer(many=False, read_only=True)
category = CategorySerializer(many=False, read_only=True)

class Meta:
    model = Post
    fields = ('category', 'id', 'title', 'image', 'slug', 'author', 'excerpt', 'content', 'status', 'published')

我相信有更好的方法可以做到这一点,所以如果有人知道,请继续展示

编辑:当上述方法工作时,这是如何使用一个serialiazerDjango Rest Framework two Serializers for the same Model

相关问题 更多 >