【问题标题】:Django Rest Framework get a lookup field as a list of hyperlinksDjango Rest Framework 获取一个查找字段作为超链接列表
【发布时间】:2019-05-14 01:06:32
【问题描述】:

我有一个模型 Album 和一个模型 Photo,它们通过 FireignKey 字段引用第一个模型。我希望模型 AlbumModelSerializer 通过查找字段返回超链接列表以关联模型 Photo 中的条目,但我只得到它返回一个 id 列表。

这些是我的模型:

class Album(models.Model):
    name = models.CharField(max_length=200, verbose_name=_("Name"))
    description = models.TextField(null=True, blank=True, verbose_name=_("Description"))
    company = models.ForeignKey(Company, on_delete=models.PROTECT, related_name='albums', verbose_name=_("Company"))
    access_code = models.CharField(max_length=30, default=_create_access_code, verbose_name=_("Internal Use"))

    class Meta:
        verbose_name = _("Album")
        verbose_name_plural = _("Albums")

    def __str__(self):
        return "[{}] {} ({})".format(self.pk, self.name, self.company.id)

class Photo(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Name"))
    album = models.ForeignKey(Album, on_delete=models.PROTECT, related_name='photos', verbose_name=_("Album"))
    photo = models.ImageField(verbose_name=_("Photo"))

    class Meta:
        verbose_name = _("Photo")
        verbose_name_plural =_("Photos")

    def __str__(self):
        return "[{}] {}".format(self.pk, self.name)

这是我的序列化器:

class AlbumSerializer(serializers.ModelSerializer):
    class Meta:
        model = proxies.AlbumProxy
        fields = ('id', 'name', 'description', 'company', 'access_code', 'photos')

我希望photos 字段返回超链接列表,但我得到了一个 id 列表:

"id": 1,
"name": "Navidad 2018",
"description": "La primera",
"company": 1,
"access_code": "xxxxxxxxxx",
"photos": [
     11,
     10,
      7,
      6
]

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我认为你需要一个HyperlinkedRelatedField,像这样:

    class AlbumSerializer(serializers.ModelSerializer):
        class Meta:
            model = proxies.AlbumProxy
            fields = (
                'id', 
                'name', 
                'description', 
                'company', 
                'access_code',  
                'photos'
            )
    
        photos = serializers.HyperlinkedRelatedField(
            many=True, 
            view_name='<your-photos-view-name>', 
            read_only=True
        )
    

    【讨论】:

      【解决方案2】:

      如果你想要你的photos full urls 你可以声明一个Serializer Method Field 来做这样的事情:

      class AlbumSerializer(serializers.ModelSerializer):
          photos_url = serializers.SerializerMethodField()
      
          class Meta:
              model = proxies.AlbumProxy
              fields = ('id', 'name', 'description', 'company', 'access_code')
      
          def get_photos_url(self, obj):
              urls = []
              request = self.context.get('request')
              for photo in obj.photos:
                  urls.append(request.build_absolute_uri(photo.url))
              return urls
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 2019-05-22
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多