Django 2.x - фильтр перенаправлений на основе содержимого реляционной базы данных - PullRequest
0 голосов
/ 20 марта 2019

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

Мои две таблицы в этой базе данных:

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)

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

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

@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')

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Вы получите значение типа счета напрямую как

account_type = request.user.profile.account_type

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

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

    else:
        return redirect('index')
1 голос
/ 20 марта 2019

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

Иначе, если ваша система имеет критерии, согласно которым один пользователь может иметь несколько профилей. Затем вам сначала нужно получить доступ к его профилям и выбрать конкретный профиль, добавив дополнительный фильтр, затем вы получите доступ к 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 предоставляет вам доступ к типу учетной записи конкретного пользователя.

Описание отношений один к одному здесь

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...