Django select_related 未按预期工作

Django select_related Not Working as Expected

我有 2 个 类,国家和坐标。当向国家 table 发出 API 呼叫时,我希望 API(使用 DRF)也能 return 相关坐标信息。

默认情况下,以下是可以理解的 returned (localhost:8000/api/country/):

{
    "id": 1,
    "name": "TestCountry",
    "coordinates": 1
}

问题是在我的 views.py 文件中实现 select_related 并修改 CountrySerializer 之后,输出仍然完全相同。我曾期待这样的事情:

{
    "id": 1,
    "name": "TestCountry",
    "coordinates": {
        "longitude": 123,
        "latitude": 456,
    }
}

或者这就足够了:

{
    "id": 1,
    "name": "TestCountry",
    "longitude": 123,
    "latitude": 456,
}

下面是模型、视图和序列化程序文件中的相关代码。

class Coordinates(models.Model):
    longitude = models.DecimalField()
    latitude = models.DecimalField()

class Country(models.Model):
    name = models.CharField()
    coordinatesID = models.ForeignKey(Coordinates, on_delete=models.SET_NULL, verbose_name="Coordinates", db_column="CoordinatesID", blank=True, null=True, related_name="coordinates")

class CountryViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Country.objects.select_related('coordinatesID').all()
    serializer_class = CountrySerializer

class CountrySerializer(DynamicFieldModelSerializer):
    longitude = serializers.ReadOnlyField(source='coordinates.longitude')
    latitude = serializers.ReadOnlyField(source='coordinates.latitude')

    class Meta:
        model = Country
        fields = '__all__'

此外,在国家 table 中,我指定了 related_name="coordinates",但是 select_related 不识别这个选项,我还是要用"coordinatesID"来引用坐标table。这是错误还是与不正确的实施有关?

请注意,related_name 用于访问从 Coordinates 模型端到 Country 端的反向关系,而不是相反。

所以在 select_related 中你可以使用模型本身定义的所有字段和关系,所以对于 Country 模型,如果你将坐标关系定义为 coordinatesID 你将需要这样做

queryset = Country.objects.select_related('coordinatesID').all()

并在序列化程序中使用

longitude = serializers.ReadOnlyField(source='coordinatesID.longitude')
latitude = serializers.ReadOnlyField(source='coordinatesID.latitude')

也使用像 coordinatesID 这样的字段名在 django 中不是很好的命名约定,因为你会有一个像 coordinatesID.id 这样的 属性,这不是很干净。

https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_one/