2015-04-13 3 views
1

Я хочу ограничить, какие строки отображаются в консоли администратора Django на основе пользователя, который вошел в систему. Используя модель AuthUser, я создал следующую модель учетной записи, ссылки которой Джанго учетные записи пользователей к конкретным предприятиям в моей базе данных:Фильтрация строк консоли администратора Django на основе зарегистрированного пользователя

class Account(models.Model): 
    id = models.AutoField(primary_key=True, editable=False) 
    username_id = models.ForeignKey('AuthUser', db_column='username_id') 
    business_id = models.ForeignKey('Business', db_column='business_id') 

Вот мой бизнес-модель:

class Business(models.Model): 
    id = models.AutoField(primary_key=True, editable=False) 
    name = models.CharField(max_length=45) 
    address = models.CharField(max_length=45) 

Когда пользователь входит в систему, я хочу, чтобы ограничить пользователя, таким образом они могут только добавить/вид/удалять записи в/из моей базы данных (через Django admin conso le) для их бизнеса. Вот моя модель ввода:

class Entry(models.Model): 
    id = models.AutoField(primary_key=True, editable=False) 
    business = models.ForeignKey('Business') 
    entry_text = models.CharField(max_length=300) 
    created = models.DateField(auto_now=True) 

Есть ли простой способ добиться этого?

ответ

3

В администраторе модели вы можете переопределить метод get_queryset().

Так что вы могли бы сделать что-то вроде,

class EntryAdmin(admin.ModelAdmin): 
     def get_queryset(self, request): 
      qs = super(EntryAdmin, self).get_queryset(request) 
      if request.user.is_superuser: 
       return qs 
      return qs.filter(business__in=request.user.account_set.all().values_list('business_id', flat=True)) 

Последняя строка, qs.filter(business__in=request.user.account_set.all().values_list('business_id', flat=True)), фильтрует начальный QuerySet (который по умолчанию все записи).

request.user.account_set.all() возвращает все объекты Account, связанные с пользователем. Да, способ, которым вы проектируете свою модель Account, позволит нескольким объектам быть связанными с пользователем. Если вы хотите ограничить его одним, вы должны рассмотреть возможность использования OneToOneField.

Приложение .values_list('business_id', flat=True) к запросу задает Django, что вы хотите, чтобы только конкретные столбцы были возвращены, в этом случае только столбец business_id. values_list возвращает список кортежей, но если вам нужен только один столбец из набора запросов, вы можете передать аргумент ключевого слова flat=True, который вернет плоский список.

+0

Не могли бы вы пояснить, что именно происходит в этой строке: return qs.filter (business__in = request.user.account_set.all(). Values_list ('business_id', flat = True)) – farbodg

+1

@foadster, добавлено объяснение выше. –

+0

Спасибо. Что такое MyModelAdmin? PyCharm дает мне ошибки ... – farbodg

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