2015-03-19 87 views
1

我正在Django中實現一個項目。簡而言之,用戶和項目以及哪些用戶在哪個項目上工作的日誌(稱爲Change)。問題是,排除第一次用戶進行更改(與項目無關),我得到一個UNIQUE constraint failed錯誤。正如您將看到change.user_id中的驗證失敗。但這不是自SQLite自動聲明的主鍵。
注意:我使用Django內置用戶模型。

錯誤日誌:Django/SQLite用戶模型UNIQUE約束失敗

Traceback: 
File "C:\Python34\lib\site-packages\django\core\handlers\base.py" in get_response 
    111.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "C:\Python34\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view 
    21.     return view_func(request, *args, **kwargs) 
File "C:\Users\George II\OneDrive\IC3D Media\ProjectLogging\views.py" in main 
    42.   change.save() 
File "C:\Python34\lib\site-packages\django\db\models\base.py" in save 
    589.      force_update=force_update, update_fields=update_fields) 
File "C:\Python34\lib\site-packages\django\db\models\base.py" in save_base 
    617.    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
File "C:\Python34\lib\site-packages\django\db\models\base.py" in _save_table 
    698.    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
File "C:\Python34\lib\site-packages\django\db\models\base.py" in _do_insert 
    731.        using=using, raw=raw) 
File "C:\Python34\lib\site-packages\django\db\models\manager.py" in manager_method 
    92.     return getattr(self.get_queryset(), name)(*args, **kwargs) 
File "C:\Python34\lib\site-packages\django\db\models\query.py" in _insert 
    921.   return query.get_compiler(using=using).execute_sql(return_id) 
File "C:\Python34\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 
    920.     cursor.execute(sql, params) 
File "C:\Python34\lib\site-packages\django\db\backends\utils.py" in execute 
    81.    return super(CursorDebugWrapper, self).execute(sql, params) 
File "C:\Python34\lib\site-packages\django\db\backends\utils.py" in execute 
    65.     return self.cursor.execute(sql, params) 
File "C:\Python34\lib\site-packages\django\db\utils.py" in __exit__ 
    94.     six.reraise(dj_exc_type, dj_exc_value, traceback) 
File "C:\Python34\lib\site-packages\django\utils\six.py" in reraise 
    658.    raise value.with_traceback(tb) 
File "C:\Python34\lib\site-packages\django\db\backends\utils.py" in execute 
    65.     return self.cursor.execute(sql, params) 
File "C:\Python34\lib\site-packages\django\db\backends\sqlite3\base.py" in execute 
    485.   return Database.Cursor.execute(self, query, params) 

Exception Type: IntegrityError at /main/ 
Exception Value: UNIQUE constraint failed: ProjectLogging_change.user_id 

models.py:

from django.db import models 
from sqlalchemy.dialects.sqlite import BOOLEAN 
from django.contrib.auth.models import User 

class Project(models.Model): 
    title=models.CharField(max_length=200,db_index=True) 

    def get_id(self): 
     try: 
      return unicode(self.id) 
     except NameError: 
      return str(self.id) 

    def __repr__(self): 
     return ('Project %r: %r' % (str(self.id), self.title)) 

    def __unicode__(self): 
     return ('Project %r: %r' % (str(self.id), self.title)) 

class Change(models.Model): 
    user=models.OneToOneField(User) 
    project=models.ForeignKey('Project') 
    starttime=models.DateTimeField(null=True,blank=True) 
    endtime=models.DateTimeField(null=True, blank=True) 
    flagged=models.BooleanField(default=False, db_index=True) 

    def __repr__(self): 
     return ('Change in project %r from %r' % (self.project.title, self.user.username)) 

    def user_changes(self, user): 
     return self.filter(user==user) 

相應查看

def main(request): 
    context = RequestContext(request) 
    user=request.user 
    if request.method=='POST': 
     projectid=request.POST['project'] 
     project = Project.objects.get(pk=int(projectid)) 
     if project: 
      change=Change(user=user, project=project,starttime=datetime.now()) 
      change.save() 
      return HttpResponse("I \'ve already start counting... You \'ve wasted 5 seconds already.") 
     else: 
      HttpResponse("Choose a valid project!") 
    else: 
     HttpResponse("Choose a POST method (???????)") 

這是很明顯,我我對Django和python非常陌生。所以相應地表現出來。感謝您的時間。

回答

4

設置關係爲user = models.OneToOneField(User)意味着可以有唯一的Change/User

將其更改爲:

user = models.ForeignKey(User) 
+0

我正要寫!好一個。 – brunofitas 2015-03-19 10:55:57

+0

感謝您澄清這個非常基本的細節! – 2015-03-19 12:18:26