首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django类型错误'Bank‘模型对象不是iterbale

django类型错误'Bank‘模型对象不是iterbale
EN

Stack Overflow用户
提问于 2021-06-13 04:31:21
回答 2查看 54关注 0票数 0

我正在尝试创建列表和详细的api视图。我有超过100K对象的数据库

model.py

代码语言:javascript
运行
复制
from django.db import models

# Create your models here.
class Banks(models.Model):
    name = models.CharField(max_length=49, blank=True, null=True)
    id = models.BigIntegerField(primary_key=True)

    class Meta:
        managed = False
        db_table = 'banks'


class Branches(models.Model):
    ifsc = models.CharField(primary_key=True, max_length=11)
    bank = models.ForeignKey(Banks, models.DO_NOTHING, blank=True, null=True)
    branch = models.CharField(max_length=250, blank=True, null=True)
    address = models.CharField(max_length=250, blank=True, null=True)
    city = models.CharField(max_length=50, blank=True, null=True)
    district = models.CharField(max_length=50, blank=True, null=True)
    state = models.CharField(max_length=26, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'branches'

serializers.py

代码语言:javascript
运行
复制
from rest_framework import serializers
from .models import Branches, Banks

class BankSerializer(serializers.ModelSerializer):
    class Meta:
        model = Banks
        fields= ['name', 'id']


class BranchSerializer(serializers.ModelSerializer):
    bank = BankSerializer(many=True,read_only=True)
    class Meta:
        model = Branches
        fields= ['ifsc','bank','branch','address','city','district','state']

views.py

代码语言:javascript
运行
复制
from rest_framework import viewsets
from .serializers import BranchSerializer
from rest_framework import viewsets
class BankViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed.
    """
    queryset = Branches.objects.all()
    serializer_class = BranchSerializer

我尝试使用.get_queryset()、.filter()代替.all(),但仍然抛出错误

代码语言:javascript
运行
复制
error datail
    Request Method: GET
    Request URL: http://127.0.0.1:8000/bankdetailapi/

Django Version: 3.2.3
Python Version: 3.9.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'api',
 'rest_framework',
 'corsheaders',
 'django_filters']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Python39\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Python39\lib\site-packages\rest_framework\viewsets.py", line 125, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Python39\lib\site-packages\rest_framework\views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "C:\Python39\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Python39\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
    raise exc
  File "C:\Python39\lib\site-packages\rest_framework\views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\Python39\lib\site-packages\rest_framework\mixins.py", line 46, in list
    return Response(serializer.data)
  File "C:\Python39\lib\site-packages\rest_framework\serializers.py", line 745, in data
    ret = super().data
  File "C:\Python39\lib\site-packages\rest_framework\serializers.py", line 246, in data
    self._data = self.to_representation(self.instance)
  File "C:\Python39\lib\site-packages\rest_framework\serializers.py", line 663, in to_representation
    return [
  File "C:\Python39\lib\site-packages\rest_framework\serializers.py", line 664, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "C:\Python39\lib\site-packages\rest_framework\serializers.py", line 515, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "C:\Python39\lib\site-packages\rest_framework\serializers.py", line 663, in to_representation
    return [

Exception Type: TypeError at /bankdetailapi/
Exception Value: 'Banks' object is not iterable

我还确保我没有犯任何打字错误。我在堆栈上找到的大多数解决方案都是关于用.get_queryset或.filter替换.all()方法,这对我来说是行不通的。我在admin.py中注册了我的模型,它通过管理可见

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-13 04:48:12

在序列化程序中删除many=TrueForeignKey链接到单个Banks实例,因此数量不多。

代码语言:javascript
运行
复制
class BranchSerializer(serializers.ModelSerializer):
    bank = BankSerializer(read_only=True)
    class Meta:
        model = Branches
        fields= ['ifsc','bank','branch','address','city','district','state']
        extra_kwargs = {
                    'bank': {'allow_null': True, 'required': False},   
        }
票数 1
EN

Stack Overflow用户

发布于 2021-06-13 04:52:15

问题出在BankSerializer中,它试图通过引用Branch实例来获取所有银行:

代码语言:javascript
运行
复制
bank = BankSerializer(many=True,read_only=True)

您的Branch模型具有对Banks的FK引用,因此只能有一个。如果删除many=true,则可以修复该错误

代码语言:javascript
运行
复制
bank = BankSerializer(read_only=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67952767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档