2011-10-31 53 views
0

我想用户模型具有以下扩展用户配置扩展:如何将用户模型,其中包括一个一对多的关系与另一个模型

class Client(models.Model): 
    business_name = models.CharField(max_length=128) 
    category = models.ForeignKey(Category) # the beginning of the problem 
    user = models.ForeignKey(User, unique=True) 

class Category(models.Model): 
    category = models.CharField(max_length=75) 

#the problem is here 
def create_client_profile(sender, instance, created, **kwargs): 
    if created: 
     Client.objects.create(user=instance) 

post_save.connect(create_client_profile, sender=User) 

所以,当我尝试同步数据库,它抱怨category_id不能为空,问题的根源是“create_client_profile”。我该如何解决这个问题? 如果我删除“create_client_profile”它的作品,但是我会松散get_profile()。

您认为this是一种解决方案吗?我不确定它是否足够Djangoish :)

+0

该链接上的博客文章如何不能成为“Djangoish”?这实际上是Django文档推荐的方式。 –

+0

我不确定是否因为它在2008年发布,他正试图解决现在成为Django一部分的问题。而且,在这篇文章的开头,他一直在抱怨Django这样做,所以据他说,他提供了更好的东西。这就是为什么我把它扔在这里为了检查其他人的意见 – blaise

+0

我看到,他实际上推荐了一种不同于get_profile()的访问配置文件的方式,但其他一切都是标准的Django。它仍然不是一个备用的“解决方案”。只要标准Django解决方案已经实施,只需使用该配置文件即可。 –

回答

0

所以,你有一个信号,无论何时创建用户,都会自动创建一个客户端。您的客户端模型有一个强制性的ForeignKey类别,但您的信号不设置类别。

解决方案应该是显而易见的:使您的类别FK null=True,或让您的信号获取/创建相关类别。

+0

我以前试过'null = True',它没有用,但那是因为视图代码中有错误。但现在它起作用了。但我仍然不明白这个信号。在创建用户时如何创建客户端,而客户端也具有强制名称字段。 – blaise

+0

如果未提供CharFields,则默认为空字符串,因此不要违反null约束。 –

+0

好的,谢谢丹尼尔 – blaise

0

数据库是否已包含数据为Client?有可能是null类别的条目。

如果更改Clientcategory行:

category = models.ForeignKey(Category, null=True) 

帮助?

+0

'null = True'解决了它。 – blaise

相关问题