2014-04-09 25 views
0

我查看了很多示例,但無法弄清楚如何在正確鏈接它們的同時使用當前已通過身份驗證的用戶執行此操作。基本上我想要通過唯一的用戶ID或用戶名與相關的項目提交更新到數據庫。與用戶認證的一對多關係

用戶是獨一無二的,但他們可以在監視列表中包含衆多項目。用戶提交,目前已登錄並通過身份驗證。

models.py

from django.contrib.auth.models import User 
class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    first_name = models.CharField(max_length=20) 
    last_name = models.CharField(max_length=20) 
    dob = models.DateField(blank=True, null=True) 
    city = models.CharField(max_length=30) 
    country = models.CharField(max_length=20) 
    def __unicode__(self): 
     return unicode(self.user) 

class WatchList(models.Model): 
    user = models.ForeignKey(UserProfile) 
    product = models.CharField(max_length=5) 

views.py

if form.is_valid(): 
    obj = form.save(commit=False) 
    obj.user = request.user.id 
    obj.save() 

我怎樣才能鏈接兩個型號認證?更新1錯誤追蹤後

class UserProfile(models.Model): 

    user = models.OneToOneField(User) 

obj.user = UserProfile.objects.get(user=request.user) 


Traceback: 

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 
    114.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "C:\News\webservice\stoxspy\mysiteapp\views.py" in watchlist 
    73.    obj.user = UserProfile.objects.get(user=request.user) 
File "C:\Python27\lib\site-packages\django\db\models\base.py" in save 
    545.      force_update=force_update, update_fields=update_fields) 
File "C:\Python27\lib\site-packages\django\db\models\base.py" in save_base 
    573.    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
File "C:\Python27\lib\site-packages\django\db\models\base.py" in _save_table 
    654.    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
File "C:\Python27\lib\site-packages\django\db\models\base.py" in _do_insert 
    687.        using=using, raw=raw) 
File "C:\Python27\lib\site-packages\django\db\models\manager.py" in _insert 
    232.   return insert_query(self.model, objs, fields, **kwargs) 
File "C:\Python27\lib\site-packages\django\db\models\query.py" in insert_query 
    1511.  return query.get_compiler(using=using).execute_sql(return_id) 
File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 
    898.    cursor.execute(sql, params) 
File "C:\Python27\lib\site-packages\django\db\backends\util.py" in execute 
    69.    return super(CursorDebugWrapper, self).execute(sql, params) 
File "C:\Python27\lib\site-packages\django\db\backends\util.py" in execute 
    53.     return self.cursor.execute(sql, params) 
File "C:\Python27\lib\site-packages\django\db\utils.py" in __exit__ 
    99.     six.reraise(dj_exc_type, dj_exc_value, traceback) 
File "C:\Python27\lib\site-packages\django\db\backends\util.py" in execute 
    53.     return self.cursor.execute(sql, params) 
File "C:\Python27\lib\site-packages\django\db\backends\sqlite3\base.py" in execute 
    450.   return Database.Cursor.execute(self, query, params) 

Exception Type: IntegrityError at /watchlist/ 
Exception Value: column user_id is not unique 

回答

1

聲明:我幫助OP在Python聊天中解決它。只需在此發佈要點即可。

您確實已將字段類型更改爲OneToOneField,但未遷移更改。因此,.get()方法正在抱怨,因爲OneToOneField將爲DB中的該字段打開UNIQUE標誌。因爲你沒有遷移,所以Django拋出了一個完整性錯誤,因爲你的django模型表示該字段應該是唯一的,但數據庫表示它不是。

運行你的遷移,你應該能夠看到南設置爲unique=True。這應該解決麻煩。

1

您需要在監視列表模型做的是創建屬性的用戶在相同的方式一個ForeignKey到用戶配置您已將UserProfile與用戶關聯起來。

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

---修訂--- 記住,request.user是用戶實例,而不是用戶配置和之前設置obj.user你需要獲得鏈接到該用戶的用戶配置。

obj.user = UserProfile.objects.get(user=request.user) 
+0

檢查更新的帖子,說實話,我看過的頁面太長,然後發佈,我想我自我更糊塗 – rodling

+0

看到我更新的答案。 – Darwin

+0

'列user_id不是唯一的' ''user_id「整數非空參考」mysiteapp_userprofile「(」id「)' – rodling

1

首先,User和UserProfile之間的關係應該是OneToOneField而不是ForeignKey。然後,您只需通過request.user.userprofile即可獲取配置文件,並將其與您的監視列表完全一致地分配給您。

+0

我認爲一對一創建獨特的項目,我需要鏈接到這個用戶的觀察列表上的許多項目 – rodling

+0

什麼?我說User和UserProfile之間的關係是OneToOne,而不是UserProfile和Watchlist之間的關係。 –

+0

用戶從'django.contrib.auth'調用。模型導入用戶' OneToOne你在說什麼? – rodling