CreateModelMixin 没有POST的表单, 而且为什么必须提供queryset?

来源:5-9 drf的Apiview、GenericView、Viewset和router的原理分析

慕工程8185567

2020-04-05

为什么我用mixins.CreateModelMixin, viewsets.GenericViewSet组合起来要求我提供queryset呢?
我在另一个项目里如此使用没有报错, 而且就算加了queryset, 在drf的页面里也没有post表单

AssertionError: 'UserCreateViewSet' should either include a `queryset` attribute, or override the `get_queryset()` method.

图片描述

class UserCreateViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = UserCreateSerializer
class UserCreateSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=20, label="用户名")
    password = serializers.CharField(max_length=32, label="密码")
    email = serializers.EmailField(max_length=30, label="邮箱")

    nickname = serializers.CharField(default="", max_length=16, label="昵称", required=False)
    real_name = serializers.CharField(default="", max_length=16, label="真实姓名", required=False)
    blog = serializers.URLField(default="", label="博客", required=False)
    github = serializers.URLField(default="", max_length=16, label="github", required=False)
    sign = serializers.CharField(default="", max_length=16, label="个性签名", required=False)
    school = serializers.CharField(default="", max_length=100, label="学校", required=False)

    def validate_username(self, username):
        if len(User.objects.filter(username=username) != 0):
            raise serializers.ValidationError("用户已存在")

    def validate(self, attrs):
        return attrs

    def save(self, validated_data):
        user = User.objects.create(
            username=validated_data['username'],
            password=make_password(validated_data['password']),
            email=validated_data['email']
        )

        UserProfile.objects.create(
            user=user,
            nickname=validated_data['nickname'],
            real_name=validated_data['real_name'],
            blog=validated_data['blog'],
            github=validated_data['github'],
            sign=validated_data['sign'],
            school=validated_data['school']
        )
router = DefaultRouter()
router.register(r'user', UserCreateViewSet, basename='user')
router.register(r'problem', ProblemListViewSet)

urlpatterns = [
    path("", include(router.urls))
]
写回答

1回答

bobby

2020-04-07

如果你确实你只有post方法可以不用设置queryset 但是如果有update和list以及retrieve方法就得加这个才行

0
0

Python前后端分离开发Vue+Django REST framework实战

Django REST framework课程视频,RESTFul API前后端分离开发

2880 学习 · 2467 问题

查看课程