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

Я прочитал документы для Django, в которых указано использование Fixtures или SQL при создании APP. Но я хочу добавлять один и тот же прибор каждый раз, когда добавляется новый пользователь. Я не вижу простого способа сделать это. Я думаю, что signal.py может быть способом сделать это, но я не могу понять, как убедиться, что Fixture добавлен без идентификатора.

Документация по приспособлению: https://docs.djangoproject.com/en/dev/howto/initial-data/

Например, есть 5 задач, которые рекомендуется запускать для каждого пользователя. Поэтому каждый раз, когда создается новый пользователь, я хочу, чтобы эти задачи добавлялись в учетную запись нового пользователя. Задачи имеют FK для пользователя.

Я открыт для предложений о том, как это сделать.


person Dave Merwin    schedule 04.03.2014    source источник


Ответы (1)


На самом деле есть довольно простой способ сделать это.

Создайте свои исходные данные где-нибудь. Любое логическое место хорошо.

Создайте сигнал: https://docs.djangoproject.com/en/dev/ref/signals/#post-save

Установите класс отправителя на django.contrib.auth.models.User

Метод, вызываемый по сигналу, получает экземпляр объекта в качестве одного из параметров. В этом сигнале у вас, к сожалению, нет возможности проверить, является ли пользователь новым пользователем, поэтому вам нужно проверить, связаны ли с ним модели «стартового набора» через внешний ключ или нет. Если их нет, то создайте свои модели, исходя из ваших исходных данных.

Другой способ сделать это - расширить django.contrib.auth.models.User и добавить свой собственный сигнал в его метод сохранения, который вызывается только при сохранении пользователя без pk. В этом случае вы можете убедиться, что каждый раз при вызове сигнала вам придется создавать новый «стартовый комплект».

person Odif Yltsaeb    schedule 05.03.2014
comment
Мне нравится ваше первое предложение. Он кажется более портативным. Я поиграю с этим. Спасибо! - person Dave Merwin; 05.03.2014