我正在使用 drf,主要问题是我的视图 returns 是空的 json
I am using drf, The main problem is that my view returns a empty json
我主要是我的观点returns一个空json。我想要我的博客分别 foreign_key user_id.
My models.py file
from django.db import models
# from django.contrib.auth.models import User
from django.utils import timezone
from datetime import datetime
from .validators import validate_allfile_extension
from restfapp.models import CustomUser
from django.contrib.auth.models import AbstractUser
CHOICE_GENDER = (('Male', 1), ('Female', 2), ('other', 3))
class CustomUser(AbstractUser):
gender = models.TextField(choices=CHOICE_GENDER, null=True)
birth_date = models.DateField(null=True, blank=True)
class Blog(models.Model):
title = models.TextField(max_length = 50)
author = models.TextField(max_length = 50)
description = models.TextField()
date = models.DateField(auto_now=True)
time = models.DateTimeField(default=datetime.now)
image = models.ImageField(null=True, verbose_name="", validators=[validate_allfile_extension])
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
def __str__(self):
return self.title
我的serializers.py文件
class AddBlogSerializer(serializers.ModelSerializer):
title = serializers.CharField(max_length=128, write_only=True, required=True, error_messages={'blank': "Please provide title"} )
author = serializers.CharField(max_length=128, write_only=True, required=True, error_messages={'blank': "Please provide author"})
description = serializers.CharField(max_length=128, write_only=True, required=True, error_messages={'blank': "Please provide description"})
image = serializers.FileField(write_only=True, required=True, error_messages={'invalid': "Please upload image, video or audio file"})
class Meta:
model = Blog
fields = ["title","author","description","image",]
我的views.py文件
@api_view(['GET', 'POST'])
# @csrf_exempt
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def blog(request):
if request.method == 'GET':
blogs_by_user_id = Blog.objects.filter(user_id=request.user.id).all()
serializer = AddBlogSerializer(blogs_by_user_id, many=True)
json_data = JSONRenderer().render(serializer.data)
return Response(json_data, status=200)
我的回复:
"[{},{},{},{},{}]"
它让我感到空虚 json 我希望我的博客具有相应的 foreign_key user_id.
CustomUser
是你的 AbstractBaseUser
吗?
因为 request.user
将 return 一个经过验证的 AbstractBaseUser
。
顺便说一句,你可以使用 request.user_id
而不是 request.user.id
(你少做 1 个查询)。
为了你的view.py
,我会这样写:
- 使用
BlogSerializer
代替 AddBlogSerializer
- 只是
return serializer.data
不需要 JSONRenderer()
因为这是 BlogSerializer
的工作
def blog(request):
if request.method == 'GET':
blogs = Blog.objects.filter(user_id=request.user_id)
serializer = BlogSerializer(blogs, many=True)
Response(serializer.data, status=status.HTTP_200_OK)
对我有用的最佳解决方案试试看:
write_only = True 阻止序列化程序 returning 读取值。考虑将其从您希望 return 发送给您的客户的任何字段中删除。
你的序列化器应该是:
classAddBlogSerializer(serializers.ModelSerializer):
title = serializers.CharField(max_length=128, required=True, error_messages={'blank': "请提供标题"} )
author = serializers.CharField(max_length=128, required=True, error_messages={'blank': "请提供作者"})
description = serializers.CharField(max_length=128, required=True, error_messages={'blank': "请提供描述"})
image = serializers.FileField(required=True, error_messages={'invalid': "请上传图片、视频或音频文件"})
class Meta:
model = Blog
fields = ["title","author","description","image",]
现在,它将 return 您的 json 数据
我主要是我的观点returns一个空json。我想要我的博客分别 foreign_key user_id.
My models.py file
from django.db import models
# from django.contrib.auth.models import User
from django.utils import timezone
from datetime import datetime
from .validators import validate_allfile_extension
from restfapp.models import CustomUser
from django.contrib.auth.models import AbstractUser
CHOICE_GENDER = (('Male', 1), ('Female', 2), ('other', 3))
class CustomUser(AbstractUser):
gender = models.TextField(choices=CHOICE_GENDER, null=True)
birth_date = models.DateField(null=True, blank=True)
class Blog(models.Model):
title = models.TextField(max_length = 50)
author = models.TextField(max_length = 50)
description = models.TextField()
date = models.DateField(auto_now=True)
time = models.DateTimeField(default=datetime.now)
image = models.ImageField(null=True, verbose_name="", validators=[validate_allfile_extension])
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
def __str__(self):
return self.title
我的serializers.py文件
class AddBlogSerializer(serializers.ModelSerializer):
title = serializers.CharField(max_length=128, write_only=True, required=True, error_messages={'blank': "Please provide title"} )
author = serializers.CharField(max_length=128, write_only=True, required=True, error_messages={'blank': "Please provide author"})
description = serializers.CharField(max_length=128, write_only=True, required=True, error_messages={'blank': "Please provide description"})
image = serializers.FileField(write_only=True, required=True, error_messages={'invalid': "Please upload image, video or audio file"})
class Meta:
model = Blog
fields = ["title","author","description","image",]
我的views.py文件
@api_view(['GET', 'POST'])
# @csrf_exempt
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def blog(request):
if request.method == 'GET':
blogs_by_user_id = Blog.objects.filter(user_id=request.user.id).all()
serializer = AddBlogSerializer(blogs_by_user_id, many=True)
json_data = JSONRenderer().render(serializer.data)
return Response(json_data, status=200)
我的回复:
"[{},{},{},{},{}]"
它让我感到空虚 json 我希望我的博客具有相应的 foreign_key user_id.
CustomUser
是你的 AbstractBaseUser
吗?
因为 request.user
将 return 一个经过验证的 AbstractBaseUser
。
顺便说一句,你可以使用 request.user_id
而不是 request.user.id
(你少做 1 个查询)。
为了你的view.py
,我会这样写:
- 使用
BlogSerializer
代替AddBlogSerializer
- 只是
return serializer.data
不需要JSONRenderer()
因为这是BlogSerializer
的工作
def blog(request):
if request.method == 'GET':
blogs = Blog.objects.filter(user_id=request.user_id)
serializer = BlogSerializer(blogs, many=True)
Response(serializer.data, status=status.HTTP_200_OK)
对我有用的最佳解决方案试试看:
write_only = True 阻止序列化程序 returning 读取值。考虑将其从您希望 return 发送给您的客户的任何字段中删除。
你的序列化器应该是:
classAddBlogSerializer(serializers.ModelSerializer): title = serializers.CharField(max_length=128, required=True, error_messages={'blank': "请提供标题"} ) author = serializers.CharField(max_length=128, required=True, error_messages={'blank': "请提供作者"}) description = serializers.CharField(max_length=128, required=True, error_messages={'blank': "请提供描述"}) image = serializers.FileField(required=True, error_messages={'invalid': "请上传图片、视频或音频文件"})
class Meta:
model = Blog
fields = ["title","author","description","image",]
现在,它将 return 您的 json 数据