如何使用自定义URL格式使用ForeignKey过滤用户模型

时间:2018-09-13 12:54:51

标签: python django url filtering

目标URL格式:

api/v1/users?applicant={applicantId}

当前(有效)URL格式:

path('users/applicant/<int:pk>/')

如何检查申请人是否已经使用applicantID(与Users表具有外键关系)以User身份在系统上设置了一个帐户?

models.py:

class Applicant(models.Model):

     APPLICATION_STATUS = (
      (1, 'Pending'),
      (2, 'Accept'),
      (3, 'Reject'),
    )

    first_name = models.CharField(max_length=200, blank=False, 
    null=False)
    last_name = models.CharField(max_length=200, blank=False, 
    null=False)
    email = models.EmailField(max_length=200, blank=False, null=False, 
    unique=True)
    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', 
    message="Phone number must be entered in the format: '+999999999'. 
    Up to 15 digits allowed.")
    phone_number = models.CharField(validators=[phone_regex], 
    max_length=17, blank=True, null=False, unique=True) # validators 
    should be a list
    linkedin_url = models.URLField(max_length=255, unique=True, 
    blank=True, null=True) #make sure diff users cant use two same 
    profile
    twitter_url = models.URLField(max_length=255, unique=True) #make 
    sure diff users cant use two same profile
    articles = ArrayField(models.URLField(), blank=False, null=False, 
    unique=True, size=3)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, 
    blank=False, related_name="applicant")
    category = models.ForeignKey(Category, on_delete=models.CASCADE, 
    related_name="applicant", blank=False)
    status = models.CharField(max_length=200, 
    choices=APPLICATION_STATUS, default=1)

    def __str__(self):
        return self.first_name



 class User(AbstractUser):

     USER_TYPE_CHOICES = (
       (1, 'Journalist'),
       (2, 'Admin'),
     )

     GENDER = (
       (1, 'Male'),
       (2, 'Female')
      )

     first_name = models.CharField(max_length=200, blank=False)
     last_name = models.CharField(max_length=200, blank=False)
     # is_active = models.BooleanField(default=True)
     password = models.CharField(max_length=200)
     email = models.EmailField(max_length=250, unique=True)
     phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', 
     message="Phone number must be entered in the format: 
     '+999999999'. Up to 15 digits allowed.")
     phone_number = models.CharField(validators=[phone_regex], 
     max_length=17, unique=True, blank=False) # validators should be a 
     list
     user_type = models.CharField(max_length=200, 
     choices=USER_TYPE_CHOICES, default=1)
     category = models.ForeignKey(Category, on_delete=models.CASCADE, 
     related_name="users")
     # posts_url = ArrayField(models.URLField(), size=3)
     country = models.ForeignKey(Country, on_delete=models.CASCADE, 
     blank=True, related_name="users")
     gender = models.CharField(max_length=200, choices=GENDER)
     image_url = models.URLField(max_length=255)
     about = models.TextField()
     applicant = models.ForeignKey(Applicant, 
     on_delete=models.CASCADE, blank=True, null=True, 
     related_name="users")


    def __str__(self):
        return self.username

    class Meta:
        ordering = ("-date_joined",)

views.py:

class IdentifyUserApplicantID(generics.RetrieveAPIView):

    queryset = User.objects.all()
    serializer_class = ApplicantSerializer
    permission_classes = (IsAuthenticated,)

    # def get_queryset(self, pk):
    #   return Applicant.objects.get(id=pk)

    def get(self, request):

        data = request.data.get('pk')

        admin_user = User.objects.get(user_type=2)

        if request.user == admin_user:

            try:
                 queryset = User.objects.get(applicant=data)
                 serializer = UserSerializer(queryset)
                 return Response(jsend.success({'users': 
                 serializer.data}))

            except User.DoesNotExist:
                 return Response(jsend.success({'users': '[]'}))

         else:
             return Response((jsend.error("You are not authorized to 
             perform this action")),
                       status=status.HTTP_404_NOT_FOUND)

附注:我检出了django-filter模块,但是文档写得不清晰,有点难以理解。如果在建议中使用django-filter作为实现该解决方案的推荐方法,那么在此方面进行更多的澄清,我们将非常高兴。

3 个答案:

答案 0 :(得分:0)

我不知道我是否理解你的问题,但是你的意思是这样的吗?

if User.objects.filter(applicant__id=pk).exists():

答案 1 :(得分:0)

path('api/v1/users', views.YOURVIEW.as_view())

并在视图中

applicantId = request.GET.get('applicant', None)

答案 2 :(得分:0)

关键是要根据查询参数进行过滤,此操作已在此处完成:http://www.django-rest-framework.org/api-guide/filtering/#filtering-against-query-parameters

使用 request.query_params.get()在.get_queryset()方法中通过URL获取用户查询...并在创建响应对象时将其作为查询集传递。

我更新的views.py:

re_path(r'^users$', IdentifyUserApplicantID.as_view(), name="identify- 
        applicant"),

我更新的urls.py

http://example.com/api/v1/users?applicant=2

示例查询:

{{1}}

希望这会有所帮助。谢谢大家的回答。