Как и где вычислить поле в Django?

Допустим, у нас есть такие модели.

class Product(models.Model):
    name = models.CharField(max_length=100)
    # ...
    main_photo = models.ImageField(upload_to='photos/')

class ProductPhoto(models.Model):
    product = models.ForeignKey(Product, related_name='photos', on_delete=models.CASCADE)
    photo = models.ImageField(upload_to='photos/')

У меня есть два мнения:

  • ProductsView. Предоставляет список продуктов с общей информацией о каждом, включая name, ..., main_photo только.
  • .
  • ProductDetailsView. Предоставляет более подробную информацию, включая все фотографии.

Я хочу, чтобы детальный вид предоставлял все фотографии в плоском массиве photos, как это [main_photo, ...rest_photos]. Как я могу сделать это с помощью django rest framework? На каком уровне должна быть реализована эта логика? Модель, представление, сериализатор?

Я думаю, что он должен быть где-то здесь, но не совсем уверен, как он должен выглядеть.

class ProductDetailsView(RetrieveAPIView):
    serializer_class = ProductDetailsSerializer

    def get_queryset(self):
        query_set = Product.objects.all()
        # ...
        return query_set

Для url фотографий добавьте метод __str__ в ProductPhoto, который будет возвращать только url фотографии

class ProductPhoto(models.Model):
...

    def __str__(self):
        return self.photo.url

и измените ProductDetailsSerializer следующим образом

class ProductDetailsSerializer(ModelSerializer):
    photo_list = serializers.SerializerMethodField()

    def get_photo_list(self, obj):
        db_photos = obj.photos.all()
        result = []
        if obj.main_photo:
            result.append(obj.main_photo.url)
        for p in db_photos:
            result.append(p.photo.url)
        return result   


    class Meta:
        model = Product
        fields = ('id', 'name', 'photo_list')

Для получения дополнительной документации, связанной с отношениями для DRF смотрите здесь

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