带有外键的序列化器,如何处理前端视图和后端查询?
Serializer with Foreign Keys, how to handle frontend view and backend queries?
我是 Django Rest Framework 的新手,我正在尝试了解如何处理前端视图和后端查询的序列化程序。
我会尝试更好地解释它。我有这些序列化器:
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')
当我检索 post 时,它看起来像这样:
{
"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"
}
并且在前端界面上显示数据非常完美,我可以轻松获得类别名称和作者姓名。
问题是当我必须将这些数据传递到“创建新的 post”端点时。数据库需要作者和类别的编号,但通过这种方式它获得了一个对象,当然它不起作用。
如果我将 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()
可以在外键显示的字段列表中添加'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')
我确信有更好的方法来做到这一点,所以如果有人知道,请继续展示它。
编辑:虽然上面的方法有效,但这是使用一个序列化程序
的方法
我是 Django Rest Framework 的新手,我正在尝试了解如何处理前端视图和后端查询的序列化程序。
我会尝试更好地解释它。我有这些序列化器:
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')
当我检索 post 时,它看起来像这样:
{
"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"
}
并且在前端界面上显示数据非常完美,我可以轻松获得类别名称和作者姓名。 问题是当我必须将这些数据传递到“创建新的 post”端点时。数据库需要作者和类别的编号,但通过这种方式它获得了一个对象,当然它不起作用。
如果我将 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()
可以在外键显示的字段列表中添加'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')
我确信有更好的方法来做到这一点,所以如果有人知道,请继续展示它。
编辑:虽然上面的方法有效,但这是使用一个序列化程序