如何在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/')
def __str__(self):
return self.photo.url

我有两个视图:

  • ProductsView。提供产品列表,并提供每种产品的一般信息,仅包括name,...,main_photo
  • ProductDetailsView。它提供了更详细的信息,包括all照片。
class ProductsView(ListAPIView):
serializer_class = ProductSerializer

class ProductDetailsView(RetrieveAPIView):
serializer_class = ProductDetailsSerializer

序列化器:

class ProductSerializer(ModelSerializer):
class Meta:
model = Product
fields = ('id', 'name', 'main_photo')

class ProductDetailsSerializer(ModelSerializer):
photos = StringRelatedField(many=True)
class Meta:
model = Product
fields = ('id', 'name', 'main_photo', 'photos')

我想要详细的视图,以提供平面阵列photos的所有照片,就像这个[main_photo, ...rest_photos]。换句话说,响应详细

{
"id": 1,
"name": "name",
"main_photo": "/media/photos/main_photo.jpg",
"photos": [
"/media/photos/photo1.jpg",
"/media/photos/photo2.jpg",
"/media/photos/photo3.jpg"
],
}

我想要得到这个:

{
"id": 1,
"name": "name",
"photos": [
"/media/photos/main_photo.jpg",
"/media/photos/photo1.jpg",
"/media/photos/photo2.jpg",
"/media/photos/photo3.jpg"
],
}

如何在django rest框架中做到这一点?应该在哪个级别实现这个逻辑?模型,视图,序列化器?

我认为它应该在这里的某个地方,但不太确定它应该是什么样子。

class ProductDetailsView(RetrieveAPIView):
serializer_class = ProductDetailsSerializer
def get_queryset(self):
query_set = Product.objects.all()
# ...
return query_set

对于照片的url,在ProductPhoto中添加__str__方法,该方法将只返回照片的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的更多关系相关文档,请查看

最新更新