Skip to main content
 首页 » 编程设计

python之Django Rest 通过查询参数过滤

2024年10月24日35zhengyun_ustc

我正在按查询参数过滤以查找与查询参数中的电话号码匹配的用户。

型号:

from django.db import models 
from django.contrib.auth.models import User 
from phonenumber_field.modelfields import PhoneNumberField 
 
 
class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    profile_image = models.ImageField(upload_to='static/user_images', blank=True, null=True) 
    phone_number = PhoneNumberField(unique=True) 
    notifications = models.BooleanField(default=True) 
    group_notifications = models.BooleanField(default=True) 
    payment_info = models.CharField(max_length=100, default="PLACEHOLDER TEXT") 

查看:

class UsersList(generics.ListAPIView): 
    serializer_class = UserSerializer 
 
    def get_queryset(self): 
         queryset = User.objects.all() 
         phone_number = self.request.query_params.get('phone_number', None) 
        if phone_number is not None: 
             queryset = queryset.filter(userprofile_phone_number=phone_number) 
        return queryset 

网址:

from django.conf.urls import include, url 
from users import views 
 
urlpatterns = [ 
 
     url(r'find$', views.UsersList.as_view()), 
 
] 

这是我在输入时遇到的错误:http://localhost:9000/find?phone_number=+447865940489

 FieldError at /api/v1/user/find 
Cannot resolve keyword 'userprofile_phone_number' into field. Choices are: auth_token, date_joined, email, emailaddress, event, eventmembersattending, first_name, groupmember, groups, id, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, request, socialaccount, suggestion, tags, user_permissions, username, userprofile 

那我做错了什么?

编辑:错误已解决,但现在我得到一个空响应

请您参考如下方法:

您需要使用双下划线访问相关userprofile字段的phone_number字段。

来自 lookups that span relationships: 上的 Django 文档

To span a relationship, just use the field name of related fields across models, separated by double underscores, until you get to the field you want.

更改 get_queryset() 中的以下行

queryset = queryset.filter(userprofile_phone_number=phone_number) # wrong 

到

queryset = queryset.filter(userprofile__phone_number=phone_number) # use double underscores