Вы должны сохранить объект 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
, и в случае, если вы хотите получить Task
s «навалом» можно использовать .select_related(..)
или .prefetch_related(..)
(хотя можно сделать это и с IntegerField
, это потребует дополнительной логики и, следовательно, будет менее изящным).