python-3.x - 为什么 Django API 返回一个空数组
问题描述
我正在使用 Django 开发 Web 应用程序,但没有得到想要的结果,Django API 返回一个空数组 ([])。这是我试图获取地点数据的序列化程序类->
from rest_framework import serializers
from . import models
class PlaceSerializer(serializers.ModelSerializer):
class Meta:
model = models.Place
fields = ('id', 'name', 'image')
这些是视图->
from rest_framework import generics
from .import models, serializers
# Create your views here.
class PlaceList(generics.ListCreateAPIView):
serializer_class = serializers.PlaceSerializer
def get_queryset(self):
return models.Place.objects.filter(owner_id=self.request.user.id)
# Only the owner can create or make changes on the places
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
解决方案
我认为这与您编写查询集的方式有关。假设您的Place
模型有一个owner
字段是模型的外键User
,您应该get_queryset
按如下方式调整模型:
def get_queryset(self):
return models.Place.objects.filter(owner__id=self.request.user.id) # notice the double underscore in owner__id
或者你可以简单地把它写成:
def get_queryset(self):
return models.Place.objects.filter(owner=self.request.user)
更新
确保首先进行身份验证。对于未经身份验证的用户,request.user
是的实例AnonymousUser
并且没有id
字段。使用以下任一方式定义您的身份验证方案:
- 在视图中使用
authentication_classes
属性。
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
class PlaceList(generics.ListCreateAPIView):
serializer_class = serializers.PlaceSerializer
authentication_classes = [SessionAuthentication, BasicAuthentication]
def get_queryset(self):
return models.Place.objects.filter(owner=self.request.user)
或者
- 使用
DEFAULT_AUTHENTICATION_CLASSES
设置模块中的字典。
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
]
}
@Eyob Tariku 这里是 Place 模型
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Place(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=255)
image = models.CharField(max_length=255)
number_of_tables = models.IntegerField(default=1)
def __str__(self):
return "{}/{}".format(self.owner.username, self.name)
推荐阅读
- javascript - 用于指定 tsconfig.json 文件名称的编译器选项?
- python - python3 - 过滤 os.walk 子目录并检索文件名+路径
- javascript - 使用 Jasmine 为多选文本框创建单元测试
- python - python中的简单多线程无法按预期工作
- c++ - 对象上的“调用没有匹配的函数”函数调用
- html - justify-content: center 不工作在 flex:100% in mobile
- ios - Xcode 可以以编程方式禁用存档吗?
- jsf - 如果客户端 ID 不匹配,为什么要向 p:messages 添加 JSF 消息?
- django - Django:带有下拉菜单选项的 inlineformset 字段
- javascript - 选项卡单击后立即浮动的 HTML 按钮