2016-02-08 1 views
0

В моем проекте мне приходится иметь дело с разными типами пользователей, например. costumers и работодатели. У каждого типа пользователей есть свои поля и разрешения: заказчик может покупать вещи, тогда как работодатель не может.Лучший способ обработки нескольких типов пользователей в Django

Я прочитал документацию Django и, похоже, есть два варианта:

  1. Costumize AbstractUser класса и добавляющих всех Полей костюмеров и работодателей. Затем используйте систему разрешений для предоставления разрешения/отзыва или создания группы для каждого типа пользователей. Недостатком здесь является то, что неиспользуемые поля.
  2. принять модель прокси:

    
    from django.contrib.auth.models import User 
    from django.db import models

    class Costumer(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE)

    class Meta: 
        db_table = 'costumers' 
        permissions = (
         ("access_this", "User may access this"), 
        ) 
        ordering = [] 
    

    класса Employee (models.Model): пользователя = models.OneToOneField (Пользователь, on_delete = models.CASCADE)

    class Meta: 
        db_table = 'employers' 
        permissions = (
         ("access_that", "User may access that"), 
        ) 
        ordering = [] 
    

    Этот случай кажется более разумным, но я не знаю, как справляться с разрешениями. Подумайте, я бы хотел использовать @permission_required вместо проверки типа (если у пользователя есть конкретное поле), потому что кажется более легитимным для системы Django.

Итак, в конце концов, как лучше всего подойти к такому сценарию?

+0

Мне нравится прокси-модель, с точки зрения кодирования.Когда вы хотите получить данные Costumer, вы начинаете с Costumers.some_things_set.filter (...), а от Employee вы начинаете с Employee.other_things_set.filter (...). Меньше подвержены ошибкам (ошибочно показывающие информацию Costumers для сотрудников и наоборот), и легче читать код. –

+0

Проблема в том, что я не знаю, как использовать разрешения в этом случае, т.е. ограничить доступ к costumer/работодателю – blueSurfer

+0

двум группам, каждый из которых принадлежит одному из них https://docs.djangoproject.com/en/1.9/ themes/auth/default/# permissions-and-authorization –

ответ

0

Первое решение намного лучше.

Недостатком здесь является то, что неиспользуемые поля.

Я не согласен с этим, вам не нужно хранить все поля в модели User. Кроме того, если вы говорите о 5 полях, например, это не имеет большого значения.


Вы можете продолжить использовать AbtractUser, а также использовать его; Вы не должны поставить все поля там:

class User(AbstractUser): 
    email = ... 
    ... 
    # for the employer, let's say you want to save the company details 
    company = models.ForeignKey('myapp.Company', null=True, blank=True) 
    ... 
    # for the customer 
    customer_details = models.ForeignKey('...') 

Таким образом, вы можете записать user_type, если вы хотите или вывести тип из внешнего ключа (если есть компания, это работодатель).


Чтобы помочь вам больше с моделью, мне нужно знать, что отличает работодателя от клиента в вашем приложении. Обратите внимание, что с этим решением экземпляр User может быть и тем, и другим.


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

+0

Разница заключается в двух полях. В моем проекте они просто отношения с другими таблицами. Я думаю, что буду использовать ваш подход, поскольку с другим я не понимаю, как обрабатывать разрешения, то есть проверять тип пользователя. – blueSurfer

+0

Тем не менее, я все еще думаю, что другой подход более «логичен». – blueSurfer

Смежные вопросы