Менеджер для профиля пользователя для создания и удаления как пользователя, так и профиля - PullRequest
1 голос
/ 12 июля 2011

У меня есть модель с именем Personnel, которую я использую в качестве модели профиля для модели User. Модераторы на моем сайте могут создавать и свои аккаунты, но все поля профиля должны быть заполнены. Вот моя модель

class Personnel(models.Model):
    """
    Model for storing the personnel information
    """
    user = models.OneToOneField(
        User
    )
    phone = models.CharField(
        null=False, max_length=50, verbose_name="Phone"
    )
    address = models.CharField(
        null=True, max_length=500, verbose_name="Address"
    )

Мне нужно реализовать следующее.

Метод create в модели Personnel, поэтому, когда кто-то вызывает метод Personnel.objects.create(username, email, phone, address), он создает нового пользователя в модели User, а также сохраняет поля профиля в модели Personnel. Для этого мне понадобится форма для обработки запроса, но эта форма должна проверять поля модели Personnel и модели User.

Метод delete на модели Personnel, поэтому, когда кто-то вызывает метод Personnel.objects.delete(username), он удаляет профиль из модели Personnel и пользователя из модели User. Я не думаю, что мне нужна форма для этого.

Может кто-нибудь сказать мне, как сделать бит формы и бит менеджера. Вот что у меня есть:

Форма:

менеджер:

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

class Personnel(models.Manager):
    """
    This is the manager for the Personnel model. It contains the logic for
    creating a new personnel which also creates a new User.
    """
    def create(self, username, email, phone, address):
        """
        Creates a new personnel
        """
        pass

    def delete(self, username):
        """
        Deletes a personnel
        """
        super(Personnel, self).delete()

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 12 июля 2011
class PersonnelManager(models.Manager):
    def create(self, username, email, phone, address, **kwargs):
        user = User.objects.get_or_create(username=username, email=email)
        return super(PersonnelManager, self).create(user=user, phone=phone, address=address, **kwargs)

class Personnel(models.Model):
    ...
    objects = PersonnelManager()

Удаление должно позаботиться о себе через каскад.

1 голос
/ 12 июля 2011

Вероятно, проще добавить методы к Personnel.save() и Personnel.delete() для выполнения этой работы.

https://docs.djangoproject.com/en/1.3/topics/db/models/#overriding-model-methods

Personnel.save () вызывается Django и может создать отсутствующего пользователя и профиль.

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

...