【问题标题】:Why is the Django API returning an empty array为什么 Django API 返回一个空数组
【发布时间】:2021-11-12 22:18:23
【问题描述】:

我正在使用 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)

【问题讨论】:

  • 检查您的 get_queryset。它返回空 [] 这就是您的 api 返回空结果的原因。

标签: python-3.x django django-models django-views rest


【解决方案1】:

你确定你在认证时调用了 api 吗?因为据我所知,您的代码没有问题。当您的视图需要进行身份验证时,您需要分配权限类(如果您没有在 settings.py 中设置默认权限类)。我相信如果您在经过身份验证时调用 api 应该没有问题。

【讨论】:

    【解决方案2】:

    我认为这与您编写查询集的方式有关。假设您的 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.userAnonymousUser 的一个实例,并且没有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)
    
    

    【讨论】:

    • 我试过了,结果还是一样。
    • 我认为这可能是由于身份验证问题。所以我已经相应地更新了我的答案。但如果解决方案仍然不起作用,您能否在问题中加入您的 Place 模型,以便我们更好地了解结构?
    • 感谢您的回复,我在上面添加了 Place 模型。
    • 我看不到上面的模型。
    • @Eyok Tariku -> 请查看此链接,名为 Place stackoverflow.com/a/69233618/8887187
    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2022-01-09
    相关资源
    最近更新 更多