Django фильтр по атрибуту ForeignKey от имени пользователя - PullRequest
1 голос
/ 23 марта 2020

Я использую Django фреймворк для создания базы данных-приложения. У меня есть структура базы данных в качестве классов. Класс "Horse", имеющий отношение ForeignKey с классом "Rider", который, в свою очередь, имеет отношение ForeignKey с пользователем.

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

file: models.py

from django.contrib.auth.models import User


class Horse(models.Model):
    name = ...
    ...
    owner = models.ForeignKey('Rider')

class Rider(models.Model):
    name = ...
    ...
    user = models.ForeignKey(User)

Поэтому, когда я рендерирую свою страницу html, я хочу соответственно отфильтровать лошадей:

file: views.py

from .models import Horse

def Horses(request):
    horses = {
        'horses': Horse.objects.filter( ??????? )
    }
    return render(request, 'stable/horses.html', horses)

Итак если я вошел в систему как «Администратор», как я могу передать это в фильтр, чтобы показывались все лошади, имеющие отношения с гонщиком, которые имеют отношения с этим пользователем?

Кажется, что-то другое, когда ссылается на объект ForeignKey вместо просто атрибута, который я не могу понять.

1 Ответ

0 голосов
/ 23 марта 2020

Вы можете просматривать сквозные отношения с двумя последовательными подчеркиваниями, поэтому вы можете фильтровать Horse объекты таким образом, чтобы его owner имел как user аутентифицированного пользователя с:

from django.contrib.auth.decorators import login_required

@login_required
def horses(request):
    horses = {
        'horses': Horse.objects.filter(<b>owner__user=request.user</b>)
    }
    return render(request, 'stable/horses.html', horses)

Примечание : Вы можете ограничить просмотры для аутентифицированных пользователей с помощью @login_required оформителя [Django -doc] .

Примечание : функции обычно записываются в snake_case , а не PerlCase , поэтому рекомендуется переименовать ваш функция до horses, а не Horses.

...