Django Rest Framework получает поле поиска в виде списка гиперссылок - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть модель Альбом и модель Фото , которая ссылается на первую через поле FireignKey .Я хочу, чтобы ModelSerializer для модели Альбом возвращал список гиперссылок, связывающих записи в модели Фото через поле поиска, но я получаю его только для возвратасписок идентификаторов.

Это мои модели:

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": 1,
"name": "Navidad 2018",
"description": "La primera",
"company": 1,
"access_code": "xxxxxxxxxx",
"photos": [
     11,
     10,
      7,
      6
]

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я думаю, вам нужно 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
    )
0 голосов
/ 13 декабря 2018

Если вы хотите, чтобы ваши фотографии были полными URL , вы можете объявить Поле метода сериализатора , чтобы сделать что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...