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/
我有 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/