看看我的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记录。现在我想基于这个现有用户创建客户端。怎么做?
答案 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