【问题标题】:How do I use perform_create to set a field automatically in Django Rest Framework?如何使用 perform_create 在 Django Rest Framework 中自动设置字段?
【发布时间】:2016-02-09 03:32:35
【问题描述】:

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

应用目录中的

urls.py如下所示:

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

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'
        )

最后,我的 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)

当我访问该 URL 时,我要做的是获取一位特定教授的所有评论列表。如果用户愿意,我还希望允许用户在此端点添加新评论。一切都很好,但我想要一个用户在创建评论时不必选择教授的系统。

假设我去 /professors/1/reviews/,获得了 pk=1 教授的所有评论列表。现在,如果用户添加新评论,教授会自动设置为 pk=1 的教授。用户无法选择。在 /professors/2/reviews/ 中,review 的教授字段自动设置为 pk=2 的教授,以此类推。

我该怎么做?感谢您的帮助。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您应该像添加作者一样简单地添加教授:

    serializer.save(
        author=self.request.user,
        professor_id=self.kwargs.get('pk'),
    )
    

    请注意,为了避免从数据库中拉出教授,我明确设置了 FK。

    【讨论】:

    • 是的,但是当pkDoesNotExist 时我们需要处理错误)
    • 这真的很有帮助。我花了一天时间才找到你的评论。谢谢兄弟。
    猜你喜欢
    • 2015-07-28
    • 2021-09-03
    • 1970-01-01
    • 2016-11-28
    • 2016-06-01
    • 1970-01-01
    • 2022-01-10
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多