Django模型对象创建

时间:2011-04-13 10:27:02

标签: python django

看看我的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 个答案:

答案 0 :(得分:5)

User是Django框架中的一个特例。 您不应该使用继承。

向其添加数据的最佳做法是创建模型并将其定义为user profile

为此创建一个模型:

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将不是您创建的对象,您将无法访问它的数据。

如果您的关注点是能够在同一页面中编辑有关该用户的所有数据,则会a way to do this

答案 1 :(得分:2)

你可以这样:

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()

答案 2 :(得分:1)

用户不是抽象的,所以扩展它不会起作用。相反,你应该使用组合。

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