我正在尝试运行.save()来更改用户模型字段的值。
这是我的代码:
Views.py:
def traffic_task(request):
tasks_traffic = Task.objects.filter(category="traffic")
random_task = random.choice(tasks_traffic)
task_id = random_task.pk
user = request.user
user.userprofile.daily_task = task_id
user.save()
return task_detail(request=request, pk=task_id)
Models.py
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
daily_task = models.IntegerField(default=0)
daily_task_done = models.BooleanField(default=False)
daily_task_done_time = models.DateTimeField(default=datetime.now() - timedelta(days=2))
它们在两个不同的应用程序中,因此可能是导入丢失了吗?
答案 0 :(得分:2)
您应该保存UserProfile
对象,而不要保存User
对象,所以类似:
def traffic_task(request):
tasks_traffic = Task.objects.filter(category="traffic")
random_task = random.choice(tasks_traffic)
task_id = random_task.pk
userprofile = request.user.userprofile
userprofile.daily_task = task_id
# perhaps you want to set daily_task_done to False here
userprofile.save()
return task_detail(request=request, pk=task_id)
此外,根据您提供的代码,您似乎想向ForeignKey
添加Task
,最好不要保存主键的值,因为未实施FOREIGN KEY
约束等:
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
daily_task = models.ForeignKey('someapp.Task', null=True, default=None)
daily_task_done = models.BooleanField(default=False)
daily_task_done_time = models.DateTimeField(default=datetime.now() - timedelta(days=2))
然后,您可以使用Task
对象,例如:
def traffic_task(request):
tasks_traffic = Task.objects.filter(category="traffic")
random_task = random.choice(tasks_traffic)
userprofile = request.user.userprofile
userprofile.daily_task = random_task
userprofile.save()
return task_detail(request=request, pk=task_id)
这样可以创建额外的验证,但是使用Task
对象也更方便,并且如果要“批量”获得Task
s,则可以使用{{ 1}}或.select_related(..)
(尽管也可以使用.prefetch_related(..)
来做到这一点,但这将需要额外的逻辑,因此不太美观)。