与用户身份验证的一对多关系

时间:2014-04-09 17:33:12

标签: python django

我查看了许多示例,但无法确定如何在正确链接它们的情况下对当前经过身份验证的用户执行此操作。基本上我想要通过唯一用户ID或用户名提交与db相关的更新。

用户是唯一的,但他们可以在关注列表中包含大量项目。用户提交,目前已登录并进行身份验证。

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

3 个答案:

答案 0 :(得分:1)

您需要在WatchList模型中执行的操作是将属性user作为ForeignKey创建为UserProfile,方法与将UserProfile与User链接的方式相同。

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

---更新--- 请记住,request.user是User实例,而不是UserProfile,在设置obj.user之前,您需要获取链接到该User的UserProfile。

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

答案 1 :(得分:1)

首先,User和UserProfile之间的关系应该是OneToOneField,而不是ForeignKey。然后,您就可以通过request.user.userprofile获取个人资料,并将其与您现在完全一样分配到您的监视列表。

答案 2 :(得分:1)

免责声明:我帮助OP在Python聊天中解决了这个问题。只需在这里发布要点。

您确实将字段类型更改为OneToOneField,但未迁移更改。因此,.get()方法正在抱怨,因为OneToOneField会为DB中的该字段启用UNIQUE标记。因为你没有迁移,所以Django抛出了一个完整性错误,因为你的django模型说该字段应该是唯一的,但DB说它不是。

运行迁移,您应该可以看到South正在设置unique=True。那应该可以解决问题。

相关问题