Создание объекта Django Model - PullRequest
0 голосов
/ 13 апреля 2011

Посмотрите на мою модель django (я вставляю сюда только ее часть):

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

class Client(DjangoUser):
    address = models.ForeignKey(Address, blank=True, null=True)

Я знаю, как создать новый Клиент и Пользователь:

client = Client(username=name, password=pass)
client.save()

ЭтоКод создает две записи: пользователь и клиент, клиент ссылается на пользователя со своим внешним ключом.

В моей базе данных mysql уже есть запись DjangoUser.И теперь я хочу создать клиент на основе этого существующего пользователя.Как это сделать?

Ответы [ 3 ]

5 голосов
/ 13 апреля 2011

User - это особый случай в структуре Django. Вы не должны использовать наследование.

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

Создайте для этого модель:

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

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True) # ensure you create one profile only
    address = models.ForeignKey(Address, blank=True, null=True)

Тогда вам необходимо объявить ее в настройках как профиль пользователя:

AUTH_PROFILE_MODULE = "your_app.UserProfile"

Тогда, на ваш взгляд:

def your_view(request):
    user_profile = request.user.get_profile()
    address = user_profile.address

Это стандартный способ сделать это, потому что приложения Django contrib, такие как admin или auth (с логином, разрешениями и т. Д.), Ожидают, что пользователь будет User классом, а не подклассом, который вы создаете.

Если вы используете наследование, request.user не будет объектом, который вы создали, и вы не сможете получить доступ к его данным.

Если вы хотите редактировать все данные, касающиесяпользователь на той же странице, то есть способ сделать это :

2 голосов
/ 13 апреля 2011

Вы могли бы что-то вроде этого:

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

class ClientDetails(models.Model):
   user = models.OneToOneField(DjangoUser)
   address = models.ForeignKey(Address, blank=True, null=True)

И ваш код для создания объекта будет выглядеть примерно так:

#assuming there is a user with this object already, you should add logic to handle the case when there is no user available.
django_user = DjangoUser.objects.get(username=name)

client = Client(user=django_user, password=pass)
client.save()

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

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

class ClientDetails(DjangoUser):
   address = models.ForeignKey(Address, blank=True, null=True)

И тогда ваш клиентский код не сильно отличается от того, что вы описали.

#assuming there is a user with this object already, you should add logic to handle the case when there is no user available.
client = Client(username=name, password=pass)
client.save()
1 голос
/ 13 апреля 2011

Пользователь не является абстрактным, поэтому его расширение не будет работать.Скорее, вы должны использовать композицию.

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

class ClientDetails(models.Model):
   user = models.OneToOneField(DjangoUser)
   address = models.ForeignKey(Address, blank=True, null=True)

Этот шаблон задокументирован здесь: http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...