2011-05-10 49 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