我查看了许多示例,但无法确定如何在正确链接它们的情况下对当前经过身份验证的用户执行此操作。基本上我想要通过唯一用户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
答案 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
。那应该可以解决问题。