模型中的电子邮件字段可以用作其余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
答案 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
经过很长一段时间的搜索,我将这些技巧分享到了一些对我有帮助的话题中,祝你好运!