如何仅在当前用户模型中更改字段的值?

时间:2018-10-27 12:32:23

标签: django django-models

我在“关卡”中有一个“进度”字段

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?

2 个答案:

答案 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等请求更改数据库中的实体。