2017-02-23 43 views
0

我有这个模型Django的:扩展用户模型轮廓onetoonefield错误

from django.contrib.auth.models import User 
from django.db import models 
from django.db.models.signals import post_save 
from django.dispatch import receiver 

from my_app.models import Teams 

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    team = models.ForeignKey(Teams, on_delete=models.CASCADE) 

    class Meta: 
     app_label = 'my_app' 

    def __str__(self): 
     return self.name 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

我然后进入壳

from django.contrib.auth.models import User 

当我输入

user = User.objects.create_user(username='test', email='[email protected]', password='test') 

我意料之中得到

IntegrityError: NOT NULL constraint failed: my_app_profile.team_id 

但是当我键入

user = User.objects.create_user(username='test', email='[email protected]', password='test', team='developer') 

我得到

TypeError: 'team' is an invalid keyword argument for this function 

如果键入

user = User.objects.create_user(username='test', email='[email protected]', password='test', profile.team='developer') 

我得到

SyntaxError: keyword can't be an expression 

任何帮助,提示或指导,将不胜感激

+0

你可以发布你的'User'和'Teams'模型以及你如何保存到'Profile'表。 – kt14

回答

1

您尚未允许团队为空,所以当你创建像这样的轮廓:

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     # Team isn't defined 
     Profile.objects.create(user=instance) 

你会得到一个错误。

允许团队为空(或在代码中设置默认以上):

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    team = models.ForeignKey(Teams, on_delete=models.CASCADE, null=True) 

    class Meta: 
     app_label = 'my_app' 

    def __str__(self): 
     return self.name 
+0

谢谢@Jens。有没有办法给球队信息添加到在User.objects.create_user的** kwargs()还是我的约束下面这个方法: >>> U = User.objects.get(用户名=“fsmith”) >>> freds_department = u.employee.department –

+0

否 - 你必须单独创建用户对象后,才能为用户 –

0

当您运行

User.objects.create_user(username='test', email='[email protected]', password='test') 

你因为post_save信号IntegrityError。它试图创建一个Profile实例,但在Profile模型team不能是NULLBy default, model fields have null=False

当您运行

user = User.objects.create_user(username='test', email='[email protected]', 
    password='test', team='developer') 

你得到错误,因为teamProfile模式,而不是User模型的字段。

当您运行

user = User.objects.create_user(username='test', email='[email protected]', 
    password='test', profile.team='developer') 

,因为你不能使用.参考属性你会得到错误。您需要使用__来过滤外键属性。例如,请参阅this问题。但是,即使您使用__,它仍然会出现错误,因为它们在User模型中没有名为profile的字段。

我会建议的另一件事是将post_save信号合并为一个,因为两者都具有相同的发件人。

0

参见the documentationForeignKey.related_name。默认情况下,OneToOneField具有相关名称以将一个模型连接到另一个模型,但ForeignKey不会。只要有这个选项,你可以做user.team来访问相关的模型。

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    team = models.ForeignKey(Teams, 
          on_delete=models.CASCADE, 
          related_name='team', 
          null=True) 
+0

他没有访问相关的对象问题,创建一个配置文件,他是有问题摆在首位创建一个。 –

+0

我的错误阅读不好。你初始化你的对象'Profile',但模型等待'team'的值,加'null = True'。这是工作,因为你允许保存模型与空字段。 – Buky