我在“关卡”中有一个“进度”字段
class Level(models.Model):
level = models.CharField(max_length=50, unique=True)
helper = models.TextField(null=True, blank=True)
progress = models.IntegerField(default=0)
我需要在“进度”中加1。我需要为每个用户存储一个不同的值。 我真的不知道该如何加点。 现在,我在views.py中有一个LevelProgress类,它向进度字段添加了1,但在全局范围中添加了1。
class LevelProgress(APIView):
def get(self, request, id):
queryset_ = Level.objects.get(pk=id)
queryset_.progress += 1
queryset_.save()
serializer = LevelFullSerializer(queryset_)
return Response(serializer.data)
如何为当前用户加1?
答案 0 :(得分:4)
您可以将OneToOneField
字段添加到Level
模型中,如下所示:
from django.conf import settings
class Level(models.Model):
level = models.CharField(max_length=50, unique=True)
helper = models.TextField(null=True, blank=True)
progress = models.IntegerField(default=0)
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
现在,在您的视图中,您可以获取当前用户的级别:
class LevelProgress(APIView):
def get(self, request, id):
queryset_ = Level.objects.get(user=request.user)
queryset_.progress += 1
queryset_.save()
serializer = LevelFullSerializer(queryset_)
return Response(serializer.data)
答案 1 :(得分:2)
那么建模是不正确的。您无法在该Level
对象上存储进度,您需要向UserLevel
和{{1}添加一个额外的模型,例如带有ForeignKey
的{{1}} },然后增加一个:
User
因此,现在我们为Level
构造一个特定的from django.conf import settings
class Level(models.Model):
level = models.CharField(max_length=50, unique=True)
helper = models.TextField(null=True, blank=True)
class UserLevel(models.Model):
level = models.ForeignKey(Level, on_delete=models.CASCADE)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
progress = models.IntegerField(default=0)
对象,并且可以更新该进度。我们甚至可以使用单个User
函数来做到这一点:
UserLevel
您可能还想更改update_or_create(..)
来序列化该用户的进度。
也就是说,根据HTTP指南,实际上不允许带有“副作用”的GET请求。通常,通过POST,PUT,PATCH等请求更改数据库中的实体。