Модель разрешения на м2м Джанго - PullRequest
1 голос
/ 29 сентября 2010

Пользователи в веб-приложении, которое я создаю, имеют несколько «своих» объектов. Давайте представим, что объект называется Toy.

Я хочу, чтобы они могли установить параметры конфиденциальности для своих Toy s, чтобы они могли установить следующие параметры видимости:

  1. Друзья друзей
  2. Друзья
  3. Разрешить только определенный набор людей
  4. Только друзей, но запретить набор людей (чтобы это оставалось секретным для некоторых людей)

Так скажу явот такие модели:

class User(models.Model): # actually a profile but simplifying
    friends = models.ManyToManyField(User, through='Friendship')

class Toy(models.Model):
    owner = models.ForeignKey(User)

Я изо всех сил пытаюсь понять, как наложить слой на данные и логику разрешений.

Я мог бы добавить переменную permission_state, в которой сохранен вышеуказанный выбор.и затем иметь m2m для вариантов № 3 и № 4, или иметь отдельные m2ms для DENY и ALLOW.

Но с учетом User, как бы я отфильтровал все игрушки, которые пользователь мог видеть, не делая ничегоразные запросы?В идеале я хочу создать список из Toy объектов за одну поездку в базу данных.

Или я неправильно подхожу к этому?

1 Ответ

1 голос
/ 29 сентября 2010

Мне пришлось один раз решить подобную проблему.Я не нашел никакого причудливого решения, потому что мне не нужно что-то крепкое и чистое.Вот что я сделал:

Я создал промежуточную модель:

class ToyPermission(models.Model):
    toy = ForeignKey(Toy)
    level = models.CharField(max_length=100, choices=(
        'f_of_f', 'Friends of friends',
        ...
    ))
    allowed_users = ...
    denied_users = ...

Затем я написал несколько декораторов для представлений, имеющих следующую подпись:

def some_view(request, toy):
    #the code

Этидекораторы проверяют права доступа, а затем устанавливают некоторые переменные, либо непосредственно в extra_context, либо в специальном kwarg.

Это решение не является идеальным, но оно может помочь вам!

Однако теперь, когда я перечитал ваш вопрос, я не уверен, что точно отвечу на ваш вопрос:

Но, учитывая пользователя, как бы я отфильтровал все игрушки, которыепользователь мог видеть

Вы имеете в виду, как на Facebook: когда пользователь A посещает страницу пользователя B, вы хотите отображать только игрушки пользователя B, которые разрешены пользователю A?

...