Django 不序列化外键字段以提高时间性能

Django 不序列化外键字段以提高时间性能,django,serialization,django-models,django-rest-framework,Django,Serialization,Django Models,Django Rest Framework,假设我有下一个模型(不介意字段类型、示例用途): class县(model.model): country=models.TextField() 类别城市(模型。模型): 国家/地区=型号。外键(国家/地区) city=models.TextField() 班级人员(模型.模型): 城市=模型。外键(城市) name=models.TextField() 以及这些模型的相应序列化 class CountrySerializer(serializers.HyperlinkedModelSeria

假设我有下一个模型(不介意字段类型、示例用途):

class县(model.model):
country=models.TextField()
类别城市(模型。模型):
国家/地区=型号。外键(国家/地区)
city=models.TextField()
班级人员(模型.模型):
城市=模型。外键(城市)
name=models.TextField()
以及这些模型的相应序列化

class CountrySerializer(serializers.HyperlinkedModelSerializer):
类元:
型号=国家
字段=(‘国家’)
类CitySerializer(序列化程序.HyperlinkedModelSerializer):
country=CountrySerializer()
类元:
模型=城市
字段=(‘城市’、‘国家’)
类PersonSerializer(serializers.HyperlinkedModelSerializer):
city=城市住宅区()
类元:
模特=人
字段=(‘名称’、‘城市’)
好的,我正在使用Django REST框架构建一个API。其中一个端点是返回所有人员的
/person

def get(请求):
persons=Person.objects.all()
数据=PersonSerializer(人,多=真)
返回JsonResponse(data.data,safe=False)
问题是:由于
ForeignKey
s,对
persons
进行序列化需要很长时间

我的主要目标是通过调整代码、模型或序列化程序使请求尽可能快地进行

简单的[1],但显然不是最好的,是将
城市
国家
的实际字符串存储在
个人
模型中,并且仅序列化这些字符串,因此实际外键仅用于查询和筛选目的。但在这种情况下,代码的伸缩性将是可怕的(?)

我也尝试使用索引,但改进不是我想要的

有什么建议吗

在我的实际情况下,我有4个不同的外键模型(其中一个里面有一个外键模型),“自然代码”和“垃圾模式”之间的时差[1 ]是代码< >代码7 >代码> VS代码> ~1 ms (我认为是“强>大< /强>改进”)。 详情:

  • 我的数据库中大约有1000个“人”和500个“外键”对象
  • 我还使用缓存数据库,因此后续请求没有那么糟糕(大约是初始请求的25%),但第一个请求很糟糕
设置:

  • Django:
    1.11
  • Python:
    3.6
这是一个相当相关的问题(哈哈)。通过这样的基本查找,您将拥有:

  • 1个数据库调用,以获取所有
    Person
    对象(所有
    查找)
在序列化程序中,您将拥有:

  • 对于每个人,1次数据库调用以获取他们的
    城市
    • 对于您获取的每个城市,添加1个数据库调用以获取该城市的
      国家
您可以使用
选择与之相关的

Person.objects.select_related('city', 'city__country')

您还可以使用
values
查找仅获取所需的字段,并在视图或
SerializerMethodField
中处理生成的平面字典

谢谢大家!!我添加了一个
@property
,以便在“
Person
”模型中仅获取城市名称,并在查询人员时使用了
select\u related
,效果很好。