首页 > 解决方案 > 如何在 DRF 中将电子邮件字段设置为 lookup_field?

问题描述

我需要user-detailurl 端点作为api/email/user@gmail.comapi/email/user2@gmail.com,但它不起作用

如果我将url字段添加到序列化程序类,那么在user-list页面上我有异常:Could not resolve URL for hyperlinked relationship using view name "user-email". You may have failed to include the related model in your API, or incorrectly configured thelookup_fieldattribute on this field.

那是我的代码: serializers.py

class EmailSerializer(serializers.ModelSerializer):
    """
    Профиль пользователя
    """
    class Meta:
        model = User
        fields = ('url', 'email', )  
        read_only_fields = ('email', )
        extra_kwargs = {
            'url': {'view_name': 'user-email', 'lookup_field': 'email'}
        }

views.py

class RetrieveModelViewSet(mixins.RetrieveModelMixin,
                            mixins.ListModelMixin,
                            viewsets.GenericViewSet):
    """
    действия просмотр
    """
    pass

class EmailViewSet(RetrieveModelViewSet):
    queryset = User.objects.all()
    serializer_class = EmailSerializer
    lookup_field = 'email'

urls.py

router.register(r'email', views.EmailViewSet, 'email') 

我也尝试通过以下方式清理电子邮件字段quote_plusserializers.py

from urllib.parse import quote_plus
class EmailSerializer(serializers.ModelSerializer):
    """
    Профиль пользователя
    """
    email = quote_plus(serializers.EmailField(read_only=True))
    class Meta:
        model = User
        fields = ('url', 'email', )  
        read_only_fields = ('email', )
        extra_kwargs = {
            'url': {'view_name': 'user-email', 'lookup_field': 'email'}
        }

但我有错误: TypeError: quote_from_bytes() expected bytes

标签: pythondjangodjango-rest-framework

解决方案


默认 ”。” 查找正则表达式( django-rest-framework.org/api-guide/routers )中不允许使用,您应该更改“lookup_value_regex”字段以允许标点符号(“.”)字符。默认是这个'[^/.]+',所以你需要从'[^/]+'中删除标点符号(“.”)。


推荐阅读