2015-03-19 41 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