想要加入三个模型并获得API输出



我有三个模型。Django默认用户,Blogs和UserActive。我想得到一个像这样的APi输出:

[
{
"blog_id": 1,
"user": {
"id": 1,
"username": "superuser",
"email": "superuser@email.com",
"first_name": "",
"is_staff": true
"last_active": "2021-04-12T13:36:47.367153Z"
},
"title": "first blog",
"description": "hola",
"image": "/images/phone.jpg",
"create_at": "2021-04-08T14:24:51.122272Z",
"update_at": "2021-04-08T14:37:00.287746Z"
}
]

但我只是使用views.py中的get_blogs(request):在api上得到这个输出。如果不包括UserActive模型中的last_active,我想包括它:

[
{
"blog_id": 1,
"user": {
"id": 1,
"username": "superuser",
"email": "superuser@email.com",
"first_name": "",
"is_staff": true
},
"title": "first blog",
"description": "hola",
"image": "/images/phone.jpg",
"create_at": "2021-04-08T14:24:51.122272Z",
"update_at": "2021-04-08T14:37:00.287746Z"
}
]

这是我的型号.py

class UserActive(models.Model):
user_active_id = models.AutoField(primary_key=True, editable=False, null=False)
user = models.OneToOneField(User, on_delete=models.CASCADE,null=False)
last_active = models.DateTimeField(auto_now_add=True, editable=False)

class Blog(models.Model):
blog_id = models.AutoField(primary_key=True, editable=False)
title = models.CharField(max_length=128,null=False,blank=False)
description = models.TextField(null=True,blank=True)
image=models.ImageField(null=True,blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
create_at = models.DateTimeField(auto_now_add=True, editable=False)
update_at =  models.DateTimeField(auto_now=True,editable=False)

以下是视图.py:

@api_view(['GET'])
def get_users(request):
user = User.objects.all().select_related('useractive')
serializer = UserSerializer(user, many=True)
return Response(serializer.data)

@api_view(['GET'])
def get_blogs(request):
blogs = Blog.objects.all()
serializer = BlogSerializers(blogs, many=True)
return Response(serializer.data)

这是serializers.py

class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id',  'username', 'email', 'first_name', 'is_staff', ]

class UserActiveSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = UserActive
fields = '__all__'
class BlogSerializers(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Blog
fields = '__all__'

您需要从UserUserActive具有反向关系,才能在UserSerializer中获得该字段。

型号:

class UserActive(models.Model):
user_active_id = models.AutoField(primary_key=True, editable=False, null=False)
user = models.OneToOneField(User, on_delete=models.CASCADE,null=False, related_name='user_active')
last_active = models.DateTimeField(auto_now_add=True, editable=False)

序列化程序:

class UserSerializer(serializers.ModelSerializer):
last_active = serializers.DateTimeField(source='user_active.last_active', read_only=True)
class Meta:
model = User
fields = ['id',  'username', 'email', 'first_name', 'is_staff', 'last_active']
UserSerializer中需要修改littel位。应该使用serializers.DateTimeField()而不是serializers.DateField()型号:
class UserActive(models.Model):
user_active_id = models.AutoField(primary_key=True, editable=False, null=False)
user = models.OneToOneField(User, on_delete=models.CASCADE,null=False, related_name='user_active')
last_active = models.DateTimeField(auto_now_add=True, editable=False)

序列化程序:

class UserSerializer(serializers.ModelSerializer):
last_active = serializers.DateTimeField(source='user_active.last_active', read_only=True)
class Meta:
model = User
fields = ['id',  'username', 'email', 'first_name', 'is_staff', 'last_active']

最新更新