Django REST框架序列化最后一个日志
我在一个网站中使用了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
{
"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
- 然后过滤与用户相关的条目
- 获取
1并将其序列化返回last()
您可以查看以下内容:,因为您只需要时间,而不需要整个实体:
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
,它就可以正常工作。非常感谢。