Как отфильтровать модель User с помощью ForeignKey, используя пользовательский формат URL - PullRequest
0 голосов
/ 13 сентября 2018

Предполагаемый формат URL:

api/v1/users?applicant={applicantId}

Текущий (рабочий) формат URL:

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

Как проверить, если заявитель уже настроил учетную запись в системе как Пользователь, используя идентификатор заявителя (который имеет отношение к иностранным ключам с таблицей Пользователи)?

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)

P.S .: Я проверил модуль django-filter, но документы не написаны четко и немного сложны для понимания. Был бы рад, если бы в этом отношении было сделано больше разъяснений, если django-фильтр является рекомендуемым способом реализации решения.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018
path('api/v1/users', views.YOURVIEW.as_view())

и в представлении

applicantId = request.GET.get('applicant', None)
0 голосов
/ 14 сентября 2018

Ключом была фильтрация по параметру запроса, что было сделано здесь: http://www.django -rest-framework.org / api-guide / filtering / # filtering-против-запроса-параметров

Использование request.query_params.get () для получения запроса пользователей через URL в вашем методе .get_queryset () ... и передачи его в качестве набора запросов при создании объекта ответа.

Мои обновленные views.py:

class IdentifyUserApplicantID(generics.ListAPIView):
    serializer_class = UserSerializer
    permission_classes = [IsAuthenticated,]
    queryset = User.objects.all()

def get_queryset(self):
    queryset = User.objects.all()
    applicant = self.request.query_params.get("applicant", None)
    if applicant is not None:
        queryset = queryset.get(applicant=applicant)

    return queryset

    def get(self, request):

        if request.user.user_type == "2":
            try:
                queryset = self.get_queryset()
                serializer = UserSerializer(queryset)
                return Response(jsend.success({'user': serializer.data}))

            except User.DoesNotExist:
                return Response(jsend.success({'user': '[]'}))
        else:
            return Response((jsend.error("You are not authorized to perform 
            this action")),status=status.HTTP_403_FORBIDDEN)

Мой обновленный urls.py

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

Пример запроса:

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

Надеюсь, это поможет. Спасибо всем за ваши ответы.

0 голосов
/ 13 сентября 2018

Не знаю, понимаю ли я ваш вопрос, но вы имеете в виду что-то вроде этого:

if User.objects.filter(applicant__id=pk).exists():
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...