【问题标题】:Getting an empty list when using filter - Django REST使用过滤器时获取空列表 - Django REST
【发布时间】:2021-08-12 18:48:30
【问题描述】:

我在 Django REST 框架中有我的 API:

这是我的models.py:

class myModel(models.Model):
    user_email = models.CharField(max_length= 200, null= False)

这是我的views.py:

class GetItemsByEmail(generics.ListAPIView):
   def get_queryset(self):
       email_items = self.request.query_params.get("user_email")
       if(email_items is not None):
          itemsReturned =  myModel.objects.all().filter(user_email = email_items)
          return Response(data= itemsReturned)

这是我的 urls.py:

url_patterns = [
   path('users/account=<str:id>/shipments', GetItemsByEmail.as_view()),
   ]

我的问题:

我得到一个空列表,从对上述端点进行 API 调用一无所获。 我想获取数据库中与特定电子邮件关联的所有项目?

【问题讨论】:

    标签: python django django-models django-rest-framework django-views


    【解决方案1】:

    在你的views.py中:

    from rest_framework import generics
    from .models import *  # noqa
    from .serializers import *
    
    
    class GetItemsByEmail(generics.ListAPIView):
        queryset = MyModel.objects.all()  # noqa
        serializer_class = MyModelSerializer
    
        def get_queryset(self):
            if self.kwargs.get('user_email_pk'):
                return self.queryset.filter(id=self.kwargs.get('user_email_pk'))
            return self.queryset.all()
    

    在 models.py 中,我必须创建另一个模型才能获得您想要的结果(通过特定的 user_email 获取所有数据库!):

    from django.db import models
    
    
    class MyModel(models.Model):
        user_email = models.CharField(max_length=200, null=False)
    
        def __str__(self):
            return self.user_email
    
    
    class ServicesModel(models.Model):
    # Just an example to emulate the expected result, do not worry about it!
        name = models.CharField('Name', max_length=200)
        user_email_service = models.ForeignKey(MyModel, related_name='services', on_delete=models.CASCADE) # Just an example to emulate the expected result, do not worry about it!
    
        def __str__(self):
            return self.name
    

    在 serializers.py 中:

    from rest_framework import serializers
    from .models import MyModel, ServicesModel
    
    
    class ServiceModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = ServicesModel
            fields = (
                'name',
            )
    
    
    class MyModelSerializer(serializers.ModelSerializer):
    
        services = ServiceModelSerializer(many=True, read_only=True)
    
        class Meta:
            model = MyModel
            fields = (
                'id',
                'user_email',
                'services',
            )
    

    在 urls.py 中:

    from django.urls import path
    
    from core.views import GetItemsByEmail
    
    urlpatterns = [
       path('users/', GetItemsByEmail.as_view(), name='users'),  # Ignore!
       path('users/account=<str:user_email_pk>/shipments/', GetItemsByEmail.as_view(), name='user_email'),
       ]
    

    在我进行本地化的测试中,我创建了两个“user_email”,每个都有不同的“服务”,因此您可以通过 id 获取所有数据,结果图像:

    你显然只需要在'views.py'和'serializers.py'中引起注意,我只是创建了所有这些代码以获得预期的结果!

    【讨论】:

      【解决方案2】:

      如果您希望查询不区分大小写,可以尝试以下操作:

      myModel.objects.filter(user_email__iexact=email_items)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-23
        • 1970-01-01
        • 1970-01-01
        • 2017-05-16
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多