Как получить значение модели ManyToMany вместо их идентификаторов?

У меня есть три модели, как показано ниже:

class TagsModel(models.Model):
    title = models.CharField(max_length=200)

    def __str__(self):
        return self.title
 
class ImagesModel(models.Model):
    title = models.CharField(max_length=500, default='image')
    image_cdn = models.TextField(null=True, blank=True)
    image = models.ImageField(upload_to='articles/images/', null=True, blank=True)
    timestamp = models.DateTimeField(auto_now=True)
    update = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.title


class ArticlesModel(models.Model):
    title = models.CharField(max_length=1000)
    category = models.CharField(max_length=40, choices=category_choices, default=('General', 'General'))
    summary = models.TextField(blank=False, null=True, max_length=5000)
    tags = models.ManyToManyField(TagsModel, blank=True)
    image = models.ImageField(blank=True, null=True, upload_to='articles/article-image/')
    image_cdn = models.TextField(blank=True, null=True)
    image_src = models.ForeignKey(ImagesModel, related_name='Image_cdn',  on_delete=models.PROTECT, null=True)
    images = models.ManyToManyField(ImagesModel, blank=True) 
    json = models.JSONField(null=True, blank=True)
    html = models.TextField(blank=True, null=True)
    is_published = models.BooleanField(default=False)
    update = models.DateTimeField(auto_now_add=True)
    timestamp = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('articles:article_detail', kwargs={'article_id': self.id})


И в view.py

class ArticlesView(APIView):

    def get(self, request):
        articles_list = ArticlesModel.objects.all()
        images_list = ImagesModel.objects.all()
        images_serializer = ImagesSerializer(images_list, many=True)
        articles_serializer = ArticlesListSerializer(articles_list, many=True)
        return Response({
            'images':images_serializer.data,
            'articles':articles_serializer.data
        })


Когда я отправляю запрос, я получаю следующие результаты: enter image description here

Проблема в том, что я получаю идентификаторы изображений и тегов, а не сами объекты! Я спрашиваю, есть ли способ в django/DRF получить объекты (изображения, теги), включенные в запросы статей, а не только их идентификаторы?

в вашем сериализаторе статьи добавьте поле, связанное со строкой, вот так...

Решение ------ 1

class ArticleModelSerializer(serializers.ModelSerializer):
    tags = serializers.StringRelatedField()
    image = serializers.CharField(source='image.image')
    class Meta:
        model = ArticleModel 
        fields = '__all__'

Решение ----- 2

class ArticleModelSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = ArticleModel 
        fields = '__all__'
        
    # Show tags (title) instead of (ID)
    def to_representation(self, instance):
        rep = super(ArticleModelSerializer, self).to_representation(instance)
        rep['tags'] = instance.tags.title
        return rep

    # Show image (path) instead of (ID)
    def to_representation(self, instance):
            rep = super(ArticleModelSerializer, self).to_representation(instance)
            rep['image'] = instance.image.image
            return rep  

Это называется отношениями сериализатора, Вы можете найти решение вашей проблемы & больше предложений в этой статье https://www.django-rest-framework.org/api-guide/relations/

Вернуться на верх