使用功能修改数据表UserProfile中的值

时间:2018-12-11 20:39:39

标签: python django django-models django-views

我正在尝试运行.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))

它们在两个不同的应用程序中,因此可能是导入丢失了吗?

1 个答案:

答案 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(..)来做到这一点,但这将需要额外的逻辑,因此不太美观)。