python - 如何在 DRF 中将电子邮件字段设置为 lookup_field?
问题描述
我需要user-detail
url 端点作为api/email/user@gmail.com
;api/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 the
lookup_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_plus
:
serializers.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
解决方案
默认 ”。” 查找正则表达式( django-rest-framework.org/api-guide/routers )中不允许使用,您应该更改“lookup_value_regex”字段以允许标点符号(“.”)字符。默认是这个'[^/.]+',所以你需要从'[^/]+'中删除标点符号(“.”)。
推荐阅读
- python - 检查元素与 BeautifulSoup/Selenium 返回的元素不同
- coldfusion - 是否有与单个 ColdFusion 请求相关的易于访问的唯一 ID?
- php - PHP - 带有特殊字符的 utf8_decode 是小写的
- python - python:用另一个列表中的项目索引替换列表项目
- wordpress - .htacces 和非 www www 重定向
- ruby-on-rails - 代表 has_many :though with Factory Bot
- java - 从 Matlab 调用 Java 类时找不到记录器的附加程序
- python - 遍历列表并进行比较
- mysql - 条件 MySQL INSERT
- css - 仅使用 CSS 来减慢悬停