如何使用perform_create在Django Rest Framework中自动设置字段?

dar*_*rse 4 python django django-rest-framework

我正在尝试为我的应用程序创建一个REST Api。

应用程序目录中的urls.py如下所示:

urlpatterns = [
    url(
        r'^professors/(?P<pk>[0-9]+)/reviews/$',
        views.ProfessorReviewList.as_view(),
        name = 'user-review-list',
    )
]
Run Code Online (Sandbox Code Playgroud)

serializers.py

class ProfessorSerializer(serializers.HyperlinkedModelSerializer):
    reviews = serializers.HyperlinkedIdentityField(view_name='professor-review-list')
    class Meta:
        model = Professor
        fields = (
            'url', 'name', 'name_code', 'university',
            'department', 'total_rating_points',
            'number_of_reviews', 'rating', 'reviews',
        )

class ReviewSerializer(serializers.HyperlinkedModelSerializer):
    author = serializers.ReadOnlyField(source='author.username')

    class Meta:
        model = Review
        fields = (
            'url', 'author', 'professor',
            'created', 'updated', 'rating', 'text'
        )
Run Code Online (Sandbox Code Playgroud)

最后,我的views.py看起来像这样:

class ProfessorReviewList(generics.ListCreateAPIView):
    queryset = Review.objects.all()
    serializer_class = ReviewSerializer
    def get_queryset(self):
        queryset = super(ProfessorReviewList, self).get_queryset()
        return queryset.filter(professor__pk=self.kwargs.get('pk'))

    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsAuthorOrReadOnly,)

    def perform_create(self, serializer):
        # The request user is set as author automatically.
        serializer.save(author=self.request.user)
Run Code Online (Sandbox Code Playgroud)

我想要做的是,当我转到URL时,获得了一位特定教授的所有评论的列表。我还希望允许用户在此端点添加新评论。一切正常,但是我想要一个系统,使用户在创建评论时不必选择教授。

假设我转到/ professors / 1 / reviews /,获得了pk = 1的教授的所有评论的列表。现在,如果用户添加了新评论,则教授将自动设置为pk = 1的教授。用户不会选择。在/ professors / 2 / reviews /,将用于审查的Professor域自动设置为pk = 2的Professor,依此类推,依此类推。

我怎样才能做到这一点?谢谢你的帮助。

Lin*_*via 6

您只需像与作者一样添加教授即可:

serializer.save(
    author=self.request.user,
    professor_id=self.kwargs.get('pk'),
)
Run Code Online (Sandbox Code Playgroud)

请注意,为了避免从数据库中撤出教授,我改为显式设置FK。

  • 是的,但是我们需要在 `pk`DoesNotExist 时处理错误) (2认同)