Skip to main content
 首页 » 编程设计

python之Django Rest Framework 获取一个查找字段作为超链接列表

2024年12月31日36powertoolsteam

我有一个模型Album 和一个模型Photo,它们通过FireignKey 字段引用第一个。我希望模型 Album 的 ModelSerializer 通过查找字段返回超链接列表以关联模型 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 
] 

请您参考如下方法:

我想你需要一个 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 
    )