无法使用 Django REST 框架获取嵌套序列化器来显示相关数据

问题描述 投票:0回答:1

由于某种原因,我的嵌套序列化器没有显示相关数据。我在网上搜索了答案,但找不到任何解决此问题的答案。我使用嵌套序列化器制作的演示应用程序按预期工作,但在我的主应用程序上,嵌套序列化器不显示相关数据。

下面是我的相关代码。

##models
...
class Location(models.Model):
    user = models.ForeignKey(User, null=False, on_delete=models.CASCADE)
    name = models.CharField("Full name", max_length=100,)
    geolocation = models.PointField()
    address1 = models.CharField("Address line 1", max_length=1024,)
    address2 = models.CharField("Address line 2", null=True, max_length=1024,)
    city = models.CharField("City", max_length=50,)
    STATES = [
    ("AL", "Alabama"),
    ("AK", "Alaska"),
    ("AZ", "Arizona"),
    ("AR", "Arkansas"),
    ("CA", "California"),
    ("CO", "Colorado"),
    ("CT", "Connecticut"),
    ("DE", "Delaware"),
    ("FL", "Florida"),
    ("GA", "Georgia"),
    ("HI", "Hawaii"),
    ("ID", "Idaho"),
    ("IL", "Illinois"),
    ("IN", "Indiana"),
    ("IA", "Iowa"),
    ("KS", "Kansas"),
    ("KY", "Kentucky"),
    ("LA", "Louisiana"),
    ("ME", "Maine"),
    ("MD", "Maryland"),
    ("MA", "Massachusetts"),
    ("MI", "Michigan"),
    ("MN", "Minnesota"),
    ("MS", "Mississippi"),
    ("MO", "Missouri"),
    ("MT", "Montana"),
    ("NE", "Nebraska"),
    ("NV", "Nevada"),
    ("NH", "New Hampshire"),
    ("NJ", "New Jersey"),
    ("NM", "New Mexico"),
    ("NY", "New York"),
    ("NC", "North Carolina"),
    ("ND", "North Dakota"),
    ("OH", "Ohio"),
    ("OK", "Oklahoma"),
    ("OR", "Oregon"),
    ("PA", "Pennsylvania"),
    ("RI", "Rhode Island"),
    ("SC", "South Carolina"),
    ("SD", "South Dakota"),
    ("TN", "Tennessee"),
    ("TX", "Texas"),
    ("UT", "Utah"),
    ("VT", "Vermont"),
    ("VA", "Virginia"),
    ("WA", "Washington"),
    ("WV", "West Virginia"),
    ("WI", "Wisconsin"),
    ("WY", "Wyoming")
    ]
    state = models.CharField(max_length=14, choices=STATES, default='AL')
    zip_code = models.CharField("ZIP / Postal code", max_length=12,)
    country = models.CharField("Country", max_length=3,)

    website = models.URLField(max_length=200, null=True)

    def _str_(self):
        return self.name


class FavoriteLocation(models.Model):
    nickname = models.CharField("Nickname", max_length=24,)
    user = models.ForeignKey(User, related_name='user_details', null=False, on_delete=models.CASCADE)
    location = models.ForeignKey(Location, related_name='location_details', null=False, on_delete=models.CASCADE)
    def _str_(self):
        return self.nickname
...

##serializers
...

class LocationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Location
        fields = ['id', 'geolocation', 'address1', 'address2', 'city', 'state', 'country', 'website']

class FavoriteLocationSerializer(serializers.ModelSerializer):
    location_details = LocationSerializer(many=True, read_only=True)
    class Meta:
        model = FavoriteLocation
        fields = ['id', 'nickname', 'user', 'location', 'location_details']
...

## viewset
...
class FavoriteLocationViewset(viewsets.ModelViewSet):
    permission_class = (IsAuthenticated,)
    queryset = FavoriteLocation.objects.all()
    serializer_class = FavoriteLocationSerializer 
...

## router
...
router.register(r'favoritelocation', FavoriteLocationViewset, basename='favorite_locations')
...

这是我在 json 响应中得到的输出。

[
    {
        "id": 2,
        "nickname": "My Favorite Restaurant",
        "user": 2,
        "location": 2
    }
]

是什么导致嵌套序列化器无法正常显示?

非常感谢您的帮助。

我已经成功创建了使用嵌套序列化器的演示应用程序,但尝试在我的主应用程序上复制它不起作用。我可以在 json 响应中看到外键,并且“深度”选项将显示存在数据并且模型设置正确。我也尝试在我的模型上添加“related_name”,但无济于事。

json django rest serialization frameworks
1个回答
0
投票

问题在于您如何使用嵌套序列化。所以你应该像这样更改

FavoriteLocationSerializer
类内部的代码:

class FavoriteLocationSerializer(serializers.ModelSerializer):
    location_details = LocationSerializer(source='location')
    class Meta:
        model = FavoriteLocation
        fields = ['id', 'nickname', 'user', 'location', 'location_details']
  1. 位置字段的类型是

    ForeignKey
    ,它是多对一关系,当您添加
    many=True
    标志时,如果该字段用于表示一对多关系,则应使用该标志。 (DRF 文档

  2. 阅读 Django 文档有关 related_name 以了解其用法。

  3. 无需设置

    read_only=True
    ,因为默认情况下嵌套序列化器是只读的。 (DRF 文档

  4. 当您要序列化的项目名称与其模型序列化器中的名称不同时,您应该使用

    source
    属性。

© www.soinside.com 2019 - 2024. All rights reserved.