我正在尝试创建列表和详细的api视图。我有超过100K对象的数据库
model.py
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
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
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(),但仍然抛出错误
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中注册了我的模型,它通过管理可见
发布于 2021-06-13 04:48:12
在序列化程序中删除many=True。ForeignKey链接到单个Banks实例,因此数量不多。
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},
}发布于 2021-06-13 04:52:15
问题出在BankSerializer中,它试图通过引用Branch实例来获取所有银行:
bank = BankSerializer(many=True,read_only=True)您的Branch模型具有对Banks的FK引用,因此只能有一个。如果删除many=true,则可以修复该错误
bank = BankSerializer(read_only=True)https://stackoverflow.com/questions/67952767
复制相似问题