【问题标题】:Could not resolve URL for hyperlinked relationship using view name无法使用视图名称解析超链接关系的 URL
【发布时间】:2019-09-15 10:33:19
【问题描述】:

我正在尝试将HyperlinkedModelSerializer 应用于我的User_Info 模型。当我尝试这样做时,我收到一条错误消息:

无法使用视图名称“user_info-detail”解析超链接关系的 URL。您可能没有在 API 中包含相关模型,或者在此字段上错误地配置了 lookup_field 属性。

我在下面提供我的模型、视图、序列化程序和 URL。会不会是我在我的模型中继承自 AbstractBaseUser 而不是 models.Model

models.py

class My_User_Info_Manager(BaseUserManager):
    def create_user(self, email, name=None, password=None, phone_number=None, reseller=None):
        user = self.model(
            email = self.normalize_email(email),
            name = name,
            phone_number = phone_number,
            reseller = reseller,

            )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, name=None, password=None):
        user = self.create_user(
            email, name=name, password=password
        )
        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)
        return user



class User_Info(AbstractBaseUser):

    email = models.EmailField(max_length=225,
                              unique=True, db_index=True, primary_key=True)

    name = models.CharField(max_length=255, null=False)


    phone_number = models.CharField(max_length=30, null=True)
    reseller = models.CharField(max_length=255, null=True)
    username = "Required for FTP Services"

    ### attributes and methods for superuser to access django admin
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    def has_perm(self, perm, obj=None):
        return self.is_superuser

    def has_module_perms(self, app_label):
        return self.is_superuser


    objects = My_User_Info_Manager()

    USERNAME_FIELD = 'email'

serializers.py

class UserInfoSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = User_Info # get model

        # add the fields
        fields = '__all__'

views.py

class UserInfoViewSet(viewsets.ModelViewSet):
    """
    Provides `list`, `create`, `retrieve`, `update`, `partial_update` and `destroy` actions for the Users 
    model.

    Overrides 'create' action hash the password from the POST payload.

    The User_Info model is a profile of a seller that can be used to log into the seller side of the web
    app. It contains relevant information about the reseller themselves.
    """

    queryset = User_Info.objects.all()
    serializer_class = UserInfoSerializer
    permission_classes = [IsAuthenticated]

    # override create method to has the password
    def create(self, request):
        request.data['password'] = make_password(request.data['password']) #hash password
        return super().create(request)

urls.py

# urls for ViewSets
router = DefaultRouter()
router.register(r'accounts', accounts_views.AccountsViewSet)
router.register(r'activity', activity_views.ActivityViewSet)
router.register(r'customers', customers_views.CustomersViewSet)
router.register(r'users', users_views.UserInfoViewSet)
router.register(r'products', products_views.ProductsViewSet)
router.register(r'payments', payments_views.PaymentsViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('admin/', admin.site.urls),
    path(r'api-token-auth/', obtain_jwt_token),
    path(r'api-token-refresh/', refresh_jwt_token),
    path('tax/', include('tax.urls')),
    # path('cdr/', include('cdr.urls')),

]

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    你应该在 UserInfoSerializer 中序列化 url,比如

    url = serializers.HyperlinkedRelatedField(
            view_name='user_info-detail', source='user_info', read_only=True)
    

    序列化器.py

    class UserInfoSerializer(serializers.HyperlinkedModelSerializer):
        url = serializers.HyperlinkedRelatedField(
        view_name='user_info-detail', source='user_info', read_only=True)
    
        class Meta:
            model = User_Info # get model
    
            # add the fields
            fields = '__all__'
    

    在 urls.py 中,更新:

    router.register(r'users', users_views.UserInfoViewSet)
    

    router.register(r'users', users_views.UserInfoViewSet, base_name='user_info')
    
    

    建议:仅在您的命名约定中将user_info 更改为userUser_Info 更改为User

    【讨论】:

    • 虽然我不再收到错误消息,但我的 api 中没有从序列化程序获得 User_Info 模型的 url 字段。它会从 API 视图中删除 pk。
    猜你喜欢
    • 2021-07-10
    • 2021-01-25
    • 2018-11-22
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多