【发布时间】:2019-02-18 05:14:24
【问题描述】:
预期的 URL 格式:
api/v1/users?applicant={applicantId}
当前(工作)URL 格式:
path('users/applicant/<int:pk>/')
如何使用申请人ID(与Users表有外键关系)检查申请人是否已经在系统上设置了用户帐户?
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-filter 是实施该解决方案的推荐方式,如果在这方面做出更多说明,将很高兴。
【问题讨论】:
-
不相关,但只有当您只能拥有一个管理员用户时,
request.user == admin_user才有意义。无论如何,只要做if request.user.user_type == 2就简单多了。 -
感谢@DanielRoseman,是的,系统上有一个管理员用户。肯定会调查你的实现,看起来更干净。
标签: python django url filtering