Django REST框架序列化最后一个日志

Django REST框架序列化最后一个日志,django,django-rest-framework,Django,Django Rest Framework,我在一个网站中使用了Django rest框架,它工作得很好 但是我遇到了一个特殊的问题,就像这样: { "name": "admin", "uid": 1, "last_login": { "time": 1503414665, "IP": "127.0.0.1" } } models.py: class User(models.Model): uid = models.IntegerField( pri

我在一个网站中使用了Django rest框架,它工作得很好

但是我遇到了一个特殊的问题,就像这样:

{
    "name": "admin",
    "uid": 1,
    "last_login": {
        "time": 1503414665,
        "IP": "127.0.0.1"
    }
}
models.py

class User(models.Model):
    uid = models.IntegerField(
        primary_key=True,
    )
    name = models.CharField(
        max_length=15,
    )

class LoginLog(models.Model):
    sn = models.AutoField(
        primary_key=True,
    )
    user = models.ForeignKey(
        to=User,
    )
    time = models.IntegerField(
        null=False,
    )
    IP = models.CharField(
        max_length=20,
        verbose_name='Login IP',
    )
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class UserListView(generics.ListAPIView, ):
    queryset = User.objects.all()
    serializer_class = UserSerializer
序列化程序.py

class User(models.Model):
    uid = models.IntegerField(
        primary_key=True,
    )
    name = models.CharField(
        max_length=15,
    )

class LoginLog(models.Model):
    sn = models.AutoField(
        primary_key=True,
    )
    user = models.ForeignKey(
        to=User,
    )
    time = models.IntegerField(
        null=False,
    )
    IP = models.CharField(
        max_length=20,
        verbose_name='Login IP',
    )
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class UserListView(generics.ListAPIView, ):
    queryset = User.objects.all()
    serializer_class = UserSerializer
如何序列化
UserSerializer
中的最后一个
LoginLog

只需按如下方式返回json数据:

{
    "name": "admin",
    "uid": 1,
    "last_login": {
        "time": 1503414665,
        "IP": "127.0.0.1"
    }
}

一种可能的解决方案是使用:

  • obj.\uuuuu class\uuuuuu
    将简单地复制
    LoginLog
  • 然后过滤与用户相关的条目
  • 获取
    last()
    1并将其序列化返回
这是否简单明了还存在争议,但它会给出想要的结果。有点黑


您可以查看以下内容:

,因为您只需要时间,而不需要整个实体:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    last_login_time = serializers.SerializerMethodField()

    def get_last_login_time(self, obj):
        last_login = obj.loginlog_set.last()
        if last_login is not None:
            return last_login.time
        return None

    class Meta:
        model = User
        fields = ('uid', 'account', 'last_login_time')

此外,默认情况下,将模型上的所有字段都列为白色会给您带来麻烦,因此不建议您这样做。要明确(如上所述)

我刚试过,它返回的错误如下:
LoginLog不是JSON可序列化的
@YYLeo我意识到了我的错误。我用一个可能有效的解决方案更新了我的答案。@YYLeo另外,您需要实现一个
LoginLogSerializer
,因为这是一个嵌套关系。谢谢!我昨天尝试了它,它引发了另一个错误:
'hyperlinkedEntityField'需要序列化程序上下文中的请求。
我试图重载
UserListView.get()
方法来传递请求,它引发:
'QuerySet'对象没有属性“pk”
我解决了这个问题,只需在
get\u login\u log
方法中获取
request
,然后传入
LoginLogSerializer
,它就可以正常工作。非常感谢。