嗨,我是django rest框架的新手,我正在尝试序列化3个嵌套模型。这些关系是:hotel_social_media_type与hotel_social_media具有一对多的关系,并且hotel与hotel_social_media具有一对多的关系。现在,我只能将hotel序列化为hotel_social_media,但是不能序列化hotel_social_media_type。
这是我的序列化器:
class SocialMediaTypeSerializer(serializers.ModelSerializer):
    """Serializes social media type"""
    class Meta:
        model = models.SocialMediaType
        fields = ('name', 'icon', 'url')
class HotelSocialMediaSerializer(serializers.ModelSerializer):
    """Serializes media files"""
    hotel_social_media_type = SocialMediaTypeSerializer(many=False, read_only=True)
    class Meta:
        model = models.HotelSocialMedia
        fields = ('url', 'hotel_social_media_type')
class HotelSerializer(serializers.ModelSerializer):
    """Serializes Restaurat, Bars, TouristInformation and Tourist Spots """
    hotel_images = HotelImageSerializer(many=True, read_only=True)
    hotel_social_media = HotelSocialMediaSerializer(many=True, read_only=True)
    class Meta:
        model = models.Hotel
        fields = ('id', 'name', 'hotel_images', 'hotel_social_media')
 
楷模:
class Hotel(models.Model):
    """Database model for hotels"""
    name = models.CharField(max_length=50)
    def __str__(self):
        """Return the model as a string"""
        return self.name
class HotelImage(models.Model):
    """Image upload for hotel"""
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=250)
    path = models.ImageField(upload_to='images/')
    created_on = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    hotel = models.ForeignKey(Hotel, related_name='hotel_images', on_delete=models.CASCADE, null=True)
    def __str__(self):
        """Return the model as a string"""
        return self.name
class SocialMediaType(models.Model):
    """Social Media Type eg: fb, twitter"""
    name = models.CharField(max_length=50)
    icon = models.ImageField(upload_to='images/')
    url = models.CharField(max_length=50)
    def __str__(self):
        """Return the model as a string"""
        return self.name
class HotelSocialMedia(models.Model):
    """Social Media"""
    hotel = models.ForeignKey(Hotel, related_name='hotel_social_media', on_delete=models.CASCADE, null=True)
    type = models.ForeignKey(SocialMediaType, related_name='hotel_social_media_type', on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=50)
    url = models.CharField(max_length=50)
    def __str__(self):
        """Return the model as a string"""
        return self.name
 
当前结果是:
{
  "id": 1,
  "name": "Alta Vista",
  "hotel_images": [
    {
      "id": 1,
      "name": "Alta Vista",
      "path": "http://127.0.0.1:8000/media/images/hotel-1.jpg"
    }
  ],
  "hotel_social_media": [
    {
      "url": "https://www.facebook.com/abscbnNEWS"
    }
  ]
}
 
我想要的是:
{
  "id": 1,
  "name": "Alta Vista",
  "hotel_images": [
    {
      "id": 1,
      "name": "Alta Vista",
      "path": "http://127.0.0.1:8000/media/images/hotel-1.jpg"
    }
  ],
  "hotel_social_media": [
    {
      "url": "https://www.facebook.com/abscbnNEWS",
      "hotel_social_media_type": {
        "name": "Facebook",
        "icon": "http://127.0.0.1:8000/media/images/fb-1.jpg"
      }
    }
  ]
}
 \` hotel_social_media \`  must also display  \` hotel_social_media_type \` 
 
问题来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您的模型,您必须在HotelSocialMediaSerializer中使用type关键字而不是hotel_social_media_type。因为您的HotelSocialMedia具有与HotelSocialMediaType相关的type字段。更改关键字可以解决您的问题。
class HotelSocialMediaSerializer(serializers.ModelSerializer):
   """Serializes media files"""
    type = SocialMediaTypeSerializer(many=False, read_only=True)
    class Meta:
        model = models.HotelSocialMedia
        fields = ('url', 'type')
 
如果要使用hotel_social_media_type关键字,则可以使用SerializerMethodField这样:
class HotelSocialMediaSerializer(serializers.ModelSerializer):
   """Serializes media files"""
    hotel_social_media_type = serializers.SerializerMethodField()
    class Meta:
        model = models.HotelSocialMedia
        fields = ('url', 'hotel_social_media_type')
    def get_hotel_social_media_type(self.obj):
        serializer = SocialMediaTypeSerializer(obj.type)
        return serializer.data
 
回答来源:stackoverflow