【问题标题】:Django Rest Framework nested relationship performance on SerializerMethodFieldDjango Rest Framework 在 SerializerMethodField 上的嵌套关系性能
【发布时间】:2021-11-22 03:33:44
【问题描述】:

我一直在寻找答案,但一无所获。这是这种情况: 我有 3 个这样定义的模型:

class State(models.Model):
    name = models.CharField(max_length=150, null=False)
    code = models.CharField(max_length=5, null=False)

class City(models.Model):
    name = models.CharField(max_length=150, null=False)
    code = models.CharField(max_length=7, null=False)
    state = models.ForeignKey(State, related_name='cities', on_delete=models.RESTRICT)

class Home(models.Model):
    code = models.CharField(max_length=25, null=False
    city = models.ForeignKey(City, related_name='homes', on_delete=models.RESTRICT)

人们对家的需求是这样的

[
    {
        "code": "10011",
        "city": "Municipio 1",
        "state": "Departamento 1"
    },
    {
        "code": "10012",
        "city": "Municipio 1",
        "state": "Departamento 1"
    }
]

我能够使用序列化程序创建该响应:

class HomeSerializer(serializers.ModelSerializer):
    city = SlugRelatedField(slug_field='name', queryset=City.objects.all())
    state = SerializerMethodField()

    class Meta:
        model = Home
        fields = ['code', 'city', 'state']

    def get_state(self, obj):
        return obj.city.state.nombre

但我不确定这是否是正确的方法,home 是一个会增长很多的表(可能有 1M+ 行),我认为这个解决方案会多次访问数据库.现在我知道我可以添加过滤和分页,但我担心这个解决方案的性能。我也试过depth = 2,但他们讨厌它。

我一直在搜索文档和示例(非常好),只需要 1 个嵌套关系,所以我真的迷路了。谢谢。

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    无论您在何处生成传递给序列化程序的查询集,您都应该使用select_related 在单个查询中获取相关数据。这样,当您访问相关字段时,将不会执行数据库查询,因为数据已经存在

    class HomeList(generics.ListAPIView):
        queryset = Home.objects.select_related('city__state')
        serializer_class = HomeSerializer
    

    【讨论】:

    • 谢谢@Iain,是的,作为 django 的新手,我在发布问题后检查了select_related,但我也有同样的疑问。如果桌子长大很多,你的解决方案有多好?
    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 2019-01-07
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多