电子邮件字段可以与Django rest框架一起用作查找字段吗

时间:2019-04-26 17:46:04

标签: django django-rest-framework

模型中的电子邮件字段可以用作其余api的查找字段吗?

我有一个模型“ User”,其中username = models.CharField()和email = models.EmailField()作为成员。我想将电子邮件设置为视图集中的查找字段,并使用以下代码进行设置。

def get_queryset(self):
    if 'email' in self.kwargs:
        return User.objects.filter(email=self.kwargs['email'])
    else:
        return User.objects.all()

    lookup_field = 'email'
    lookup_url_kwarg = 'email'

但是,由于电子邮件字段始终包含“。”,因此查找失败,并显示“当前路径与任何这些都不匹配”消息。如何使用包含“。”的值执行成功的api查找。例如一封电子邮件

获取/api/user/abc@def.com

2 个答案:

答案 0 :(得分:1)

在视图集中指定 lookup_value_regex 属性

class FooViewset(ModelViewSet):
    queryset = Foo.objects.all()
    serializer_class = FooSerializer
    lookup_field = 'email'
    lookup_url_kwarg = 'email'
    lookup_value_regex = '[\w@.]+' # here is the new attribute

注意::您不必覆盖 get_queryset() 方法。

答案 1 :(得分:0)

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

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

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

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

经过很长一段时间的搜索,我将这些技巧分享到了一些对我有帮助的话题中,祝你好运!