2013-06-02 7 views
5

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

Учитывая возможность добавлять поля User, если проект имеет только один тип User, позволяет сказать Student модель, я могу просто добавить студентов конкретных полей User? Я новичок в Django, но я считаю, что альтернативой было бы установить общие настройки User и создать модель Student, а также индивидуальное уникальное поле, в котором он вызывает пользователя.

Должны ли вы когда-нибудь расширять поля Django User, чтобы имитировать модель, даже если у проекта гарантирован только один тип пользователя?

ответ

12

Если у вас только один тип пользователя и используете Django 1.5+, я бы рекомендовал воспользоваться новым AbstractUser. Extending Django's default user

В качестве примера, где вы хотите добавить дату рождения и любимого цвета:

#myusers/models.py 
from django.contrib.auth.models import AbstractUser 
from django.db import models 

class MyUser(AbstractUser): 
    dob = models.DateField() 
    favorite_color = models.CharField(max_length=32, default='Blue') 

Если вам нужно больше гибкости вы можете продлить AbstractBaseUser вместо AbstractUser, но для большинства основных случаев должны только AbstractUser.

Также обратите внимание, что в любом случае вам понадобится reference your user model by using settings.AUTH_USER_MODEL.

Используя из примера выше, и предполагая, что приложение было определено в называется myusers:

#settings.py 
AUTH_USER_MODEL = 'myusers.MyUser' 

метод вы упоминаете о создании модели студента с поля один-к-одному с моделью пользователя все еще работает , но не так чист (есть еще случаи, когда это имеет смысл, если у вас есть несколько пользователей).

Я обычно не люблю ссылаться на книги в ответах, но я обнаружил, что Two Scoops of Django's, Глава 16 на модели пользователя дал более четкое объяснение того, где различные варианты подходят, чем текущая версия онлайна Джанго Docs. Книга в целом очень полезная интро для Django и была написана на основе 1.5. Вам нужно будет купить книгу или найти кого-то, у кого она есть, хотя ... (FYI: у меня нет денег, рекомендующих это).

Вы также мог бы взглянуть на этом SO вопроса/ответ: https://stackoverflow.com/a/14104748/307293

+0

Что не так чисто? –

+3

Создает дополнительную таблицу в базе данных. Если вы часто ссылаетесь на такие вещи, как имя и фамилия, а также некоторые ваши пользовательские данные, которые требуют дополнительного JOIN каждый раз. – Jacinda

+0

Jacinda - по совпадению я купил книгу раньше сегодня! Я еще не получил этого, но, глядя на эту ссылку, они дают три хороших варианта: привязка назад к связанной модели, подклассу AbstractUser или подклассу AbstractBaseClassUser. К сожалению, я использую стороннее приложение, которое я хочу подкласса, любые идеи о том, как это сделать? – Joker

0

Вы не должны касаться модели django, внесенной User (из системы проверки подлинности). Это сломает обновления, и вы не знаете, какие другие последствия могут иметь последствия.

Есть два основных способа сделать это:

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

  2. Если вы хотите изменить работу аутентификации, вы можете использовать create your own User model и использовать django (только с 1.5+).

+5

Это не правильно, если вы начинаете новое приложение в версии 1.5. Новая передовая практика, если вам просто нужно добавить дополнительные поля, - это наследовать от AbstractUser. – Jacinda

+0

Нет, вы только наследуете от AbstractUserModel, когда вы создаете модель пользователя _replacement_; и вы не должны этого делать, если хотите просто добавить поле. Вы должны создать свою собственную замену модели пользователя, если вы внесете некоторые фундаментальные изменения в том, как процесс аутентификации/авторизации будет работать для вашего приложения. –

+3

Я не говорю о AbstractBaseUser, который создает замену. Я говорю об AbstractUser. Из документов: «Если вы полностью довольны моделью пользователя Django, и вы просто хотите добавить дополнительную информацию о профиле, вы можете просто подклассифицировать django.contrib.auth.models.AbstractUser и добавить свои собственные поля профиля. полная реализация Пользователя по умолчанию в качестве абстрактной модели ». – Jacinda

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