Изменить значение в таблице данных UserProfile с помощью функции - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь запустить .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 голосов
/ 11 декабря 2018

Вы должны сохранить объект 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
    <b>userprofile.save()</b>
    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 = <b>models.ForeignKey('someapp.Task', null=True, default=None)</b>
    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 = <b>random_task</b>
    userprofile.save()
    return task_detail(request=request, pk=task_id)

Таким образом, создается дополнительная проверка, но также удобнее работать с объектом Task, и в случае, если вы хотите получить Tasks «навалом» можно использовать .select_related(..) или .prefetch_related(..) (хотя можно сделать это и с IntegerField, это потребует дополнительной логики и, следовательно, будет менее изящным).

...