Python DRF:正确使用序列化程序和视图集的理论方法
我喜欢Python和Django,在过去的几周里我一直在学习Django REST框架,因为在2020年的今天,REST是无法逃避的。 在我的hobbie项目中(这是一个Python论坛,因为它是一个Python聚会,所以被戏称为Pyrty),我决定为Python DRF:正确使用序列化程序和视图集的理论方法,python,python-3.x,django,rest,django-rest-framework,Python,Python 3.x,Django,Rest,Django Rest Framework,我喜欢Python和Django,在过去的几周里我一直在学习Django REST框架,因为在2020年的今天,REST是无法逃避的。 在我的hobbie项目中(这是一个Python论坛,因为它是一个Python聚会,所以被戏称为Pyrty),我决定为评论应用程序制作一个CRUD。我做到了(除了更新),但我不知道将代码放入序列化程序和/或视图集中有什么区别 我的create和list在序列化程序中,而delete在视图集中。所有这些都按预期工作,但我不想编写脏代码,我希望了解将某些内容放在某个部
评论
应用程序制作一个CRUD。我做到了(除了更新),但我不知道将代码放入序列化程序和/或视图集中有什么区别
我的create
和list
在序列化程序中,而delete
在视图集中。所有这些都按预期工作,但我不想编写脏代码,我希望了解将某些内容放在某个部分或另一部分的要点和区别
comments.models.py:
class Comment(PyrtyModel): # the inheritance class just adds creation and modification dates, and sorting stuff
user = models.ForeignKey('users.User', on_delete=models.CASCADE, null=False)
post = models.ForeignKey('posts.Post', on_delete=models.CASCADE, null=False)
content = models.TextField(max_length=1000, null=False, blank=False)
positive_votes = models.ManyToManyField('users.User', related_name='c_positive_vote_set')
negative_votes = models.ManyToManyField('users.User', related_name='c_negative_vote_set')
score = 0
def __init__(self, *args, **kwargs):
# init with the score (positive votes - negative votes) if the comment is persisted
super(Comment, self).__init__(*args, **kwargs)
if self.id is not None:
self.score = (
self.positive_votes.all().count() -
self.negative_votes.all().count()
)
def __str__(self):
"""Return the comment str."""
return "'{}'".format(self.content)
class Meta(PyrtyModel.Meta):
ordering = ['created', 'modified']
comments.serializers.py:
class CommentSerializer(serializers.ModelSerializer):
"""Comment model serializer."""
user = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Comment
fields = '__all__'
def create(self, validated_data):
"""Create a new comment in some post, by request.user."""
validated_data['user'] = self.context['request'].user
return super().create(validated_data)
def list(self, request):
"""List all the comments from some post."""
if 'post' not in request.query_params:
raise ValidationError('Post id must be provided.')
q = self.queryset.filter(post=request.query_params['post'])
serializer = CommentSerializer(q, many=True)
return Response(serializer.data)
comments.views.py:
class CommentViewSet(viewsets.ModelViewSet):
serializer_class = CommentSerializer
queryset = Comment.objects.all()
def get_permissions(self):
permissions = []
if self.action == 'create' or self.action == 'destroy':
permissions.append(IsAuthenticated)
return [p() for p in permissions]
def get_object(self):
"""Return comment by primary key."""
return get_object_or_404(Comment, id=self.kwargs['pk'])
def destroy(self, request, *args, **kwargs):
"""Delete a comment created by request.user from a post."""
instance = self.get_object()
if instance.user != request.user:
raise ValidationError('Comment does not belong to the authenticated user.')
self.perform_destroy(instance)
run_reputation_update(request.user)
return Response(status=status.HTTP_204_NO_CONTENT)
def retrieve(self, request, pk=None):
pass
def update(self, request, pk=None):
pass
def partial_update(self, request, pk=None):
pass
我应该在何时何地将代码放在一个部分或另一个部分?序列化程序用于验证请求数据(传入参数)并格式化(序列化)要发送回响应的数据 此外,序列化程序具有类似于
创建
、更新
和保存
的方法,在这些方法中,您可以定义应如何保存已验证数据的逻辑。尤其是对于模型序列化程序来说,这非常方便
所有其他逻辑都应在视图/视图集中定义
我很确定CommentSerializer
中的list
方法没有任何作用。因为序列化程序没有list
方法,您在那里定义了它,但从未使用过<另一方面,code>ModelViewSet有list
方法,我很确定这是获取注释列表时使用的方法,而不是序列化程序中的list
方法