2011-05-10 59 views
0

我有一个用户提交表单,并且用户提供他的名字和电子邮件。每封电子邮件都与网络相关联(在用户注册之前由管理员),并根据用户的电子邮件将他分配到该网络。在Django的模型中遇到问题

这里是models.py的样子 -

class Network(models.Model): 
    network = models.CharField(max_length=50) 
    location = models.CharField(max_length=50) 

class EmailList(models.Model): 
    email = models.EmailField(blank=True) 
    network = models.CharField(max_length=50) 

class User(models.Model): 
    name = models.CharField(max_length=50) 
    email = models.EmailField(max_length=50) 
    network = models.ForeignKey(Network)  

而在views.py这是我使用的尝试插入记录到数据库中的东西 -

User.objects.create(
name = cd['name'] 
email=cd['email'], 
network= EmailList.objects.filter(email=request.POST.get('email'))['network']) 

但是,我收到来自network=行的TypeError异常。该语法应该在这里“拉”并将与电子邮件关联的网络插入到数据库中?我在做什么错误

更新

这是我在views.py用得到它的工作的代码。

email_list = EmailList.objects.get(email=cd['email']) 
network= Network.objects.get(network=email_list.network) 
User.objects.create(
    name=cd['name'], 
    email=cd['email'], 
    network=network) 

当我尝试设置变量email = cd['email']然后定义使用该变量,像这样EMAIL_LIST - email_list = EmailList.objects.get(email=email),它会抛出一个异常说的QuerySet中的emailList没有发现将通过unicode字符串。

为什么在传递它之前定义变量在这种情况下会创建一个unicode字符串,而直接传递表达式不会呢?

+1

EmailList中的'email'应该是'user'作为'User'的外键,'network'应该是'Network'的外键而不是'CharField'。这样可以节省大量的头痛。 – 2011-05-10 20:52:32

回答

3

再次,您不应该直接使用发布数据。

过滤器返回的查询集不是实例。这看起来像是什么导致你的问题。 此外,你需要得到一个网络实例,而不是一个字符串设置为User.network:

如果EmailList和网络模型的网络的电子邮件是唯一的,您可以执行以下操作,如果不是,并且有多个条目使用get会引发错误。

name = cd.get('name') 
email = cd.get('email') 
email_list = EmailList.objects.get(email=email) 
network = Network.objects.get(network=email_list.network) 

User.object.create(name=name, email=email, network=network) 
+0

谢谢你的帮助。现在,看起来逻辑正在工作,但我得到一个错误,说EmailList不存在匹配查询。但是,当我查看数据库时,我所指定的电子邮件确实存在,并且网络和电子邮件条目都是唯一的。另外,我是否应该在EmailList类模型的“网络”列中添加一个外键? – David542 2011-05-10 18:48:50

+0

这很有意义,因为您的电子邮件列表与网络具有多对一的关系。您可以将许多电子邮件与单个网络相关联。此外,它还可以节省您查找网络对象的空间,因为您可以在创建用户对象时直接获取电子邮件列表对象并直接使用fk。 – DTing 2011-05-10 20:23:53