首页 > 解决方案 > 为什么 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)

标签: python-3.xdjangodjango-modelsdjango-viewsrest

解决方案


我认为这与您编写查询集的方式有关。假设您的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)


推荐阅读