Django 2.x — фильтрует перенаправления на основе содержимого реляционной базы данных

#django

#django

Вопрос:

У меня есть приложение, которое я разрабатываю, у которого есть 2 типа пользователей (A и B), и у меня есть страница, на которую я хочу перенаправлять пользователей, не прошедших проверку подлинности, и не типа B. Тип пользователя задается в реляционной базе данных.

Мои две таблицы db для этого

User - pk, etc...
Profile - pk, uid (user pk), account_type

Что я сделал до сих пор:

Я уже использовал @login_required в своем views.py документе для успешной проверки подлинности.

Я могу фильтровать содержимое, для которого pid задан вручную: Profile.objects.filter(user__pk=1) И я могу получить текущий идентификатор пользователя с помощью request.user.id

С чем я борюсь

Что я попытался сделать, так это создать условие, где я использую request.user.id с фильтром, чтобы найти этого пользователя, а затем проверить тип учетной записи. Я не уверен, как извлечь account_type и на данный момент мой код становится беспорядочным и, вероятно, неэффективным. Я искал это, но все, что я нашел, используя приведенные здесь ключевые слова, выявило проблемы, отличные от тех, которые я пытаюсь решить.

Отредактированная дополнительная информация

У меня здесь используются 2 приложения, 1 — это accounts одно listings , страница, для которой я это делаю, предназначена для публикации списка, который находится в listing приложении; Я хочу, чтобы только один тип пользователя (B) мог его опубликовать.

в учетных записях у меня есть этот класс:

 class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    location = models.CharField(max_length=30, blank=True)
    account_type = models.CharField(max_length=30)
  

В приложении listing я еще не создал соответствующую модель, насколько я понимаю, эта фильтрация будет происходить в представлении.

В представлении, которое я делаю:

 @login_required
def post(request):
   current_user = request.user
   if : #here is where I want to filter, but haven't been able to get it to work

   else:
     return redirect('index')

  

Комментарии:

1. Отправьте код для дальнейшего понимания

2. Можете ли вы показать нам модели?

3. И запросы, которые вы используете?

4. У каждого пользователя есть профиль? Если это так, вы должны быть в состоянии сделать: if user.profile.account_type != "B": . В противном случае вам придется перехватывать UserProfile.DoesNotExist и использовать поведение по умолчанию.

Ответ №1:

Вы получите значение типа учетной записи непосредственно как

 account_type = request.user.profile.account_type  

Таким образом, вы могли бы выполнять действия в соответствии со account_type значением, как показано ниже,

 @login_required
def post(request):
    account_type = request.user.profile.account_type
    if account_type == "B"
       # do your stuff

    else:
        return redirect('index')  

Ответ №2:

Начиная с вашего дизайна модели, если в вашей системе есть критерии, по которым у одного пользователя есть только один профиль. Затем установите uid в модели профиля как OneToOneField, чтобы вы могли легко получить доступ к account_type с помощью User.objects.filter(id=request.user.id).profile.account_type .

В противном случае, если в вашей системе есть критерии, по которым у одного пользователя может быть несколько профилей. Затем вам сначала нужно получить доступ к it profiles и выбрать конкретный профиль, добавив дополнительный фильтр, затем вы получаете доступ к account_type:

User.objects.filter(id=request.user.id).profile_set.all() предоставляет полный профиль пользователя.

User.objects.filter(id=request.user.id).profile_set.get(your_filter) предоставляет вам конкретный профиль пользователя.

User.objects.filter(id=request.user.id).profile_set.get(your_filter).account_type предоставляет вам доступ к account_type профиля конкретного пользователя.

Описание взаимосвязи «Один к одному» здесь

Описание внешнего ключа (многие к одному) здесь