Как и где вычислить поле в 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 смотрите здесь