首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在DRF中将电子邮件字段设置为lookup_field?

如何在DRF中将电子邮件字段设置为lookup_field?
EN

Stack Overflow用户
提问于 2019-04-17 02:58:42
回答 2查看 1.1K关注 0票数 2

我需要作为% api/email/user@gmail.comapi/email/user2@gmail.comuser-detail url终结点,但它不起作用

如果我将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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
class RetrieveModelViewSet(mixins.RetrieveModelMixin,
                            mixins.ListModelMixin,
                            viewsets.GenericViewSet):
    """
    действия просмотр
    """
    pass

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

urls.py

代码语言:javascript
运行
复制
router.register(r'email', views.EmailViewSet, 'email') 

我也尝试了quote_plus的干净电子邮件字段:serializers.py

代码语言:javascript
运行
复制
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

EN

Stack Overflow用户

发布于 2020-03-23 14:57:04

同样的问题,我处理如下。

我会使用电子邮件字段进行查找,但不可能在URL端点中使用它。

由于我的API中的json包含良好的URL端点及其相关的电子邮件,因此我查询该json以获取URL端点。一种手动关系:

代码语言:javascript
运行
复制
import requests, json, subprocess

REQUEST_URL = 'http://127.0.0.1:8000/users/?format=json'
login = 'DjangoLogin'
password = 'DjangoPassWord'
response = requests.get(REQUEST_URL, auth=(login, password))

json_data = response.text.encode('utf-8', 'ignore')
readable_json = json.loads(json_data)

email_reference = YOUR_EMAIL_FIELD
new_firstname = YOUR_FIRSTNAME_FIELD
new_lastname = YOUR_LASTNAME_FIELD

match_count = 0

for results in readable_json['results']:
    match_count += 1
    if results['email'] == email_reference and results['email'] is not None and match_count != 1:
        my_url = results['url']

        my_cmd = 'http -a ' + login + ':' + password + ' PUT ' + my_url + ' firstname="' + new_firstname + '"' + ' lastname="' + new_lastname + '"'

        p = subprocess.Popen(my_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = p.communicate()

在我的网站上有更多的解释:https://hg-map.fr/astuces/69-django-rest-api

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55714961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档