【发布时间】:2020-12-03 02:13:00
【问题描述】:
大家好几周来一直在研究 Rest API,我了解了序列化器和嵌套序列化器。我被困在从两个模型中抓取字段是否可以在序列化程序中进行。这是我的代码。
class Slider(BaseModel):
page = models.ForeignKey(Page, on_delete=models.CASCADE)
section = models.CharField(
max_length=20,
validators=[validators.validate_section_name],
)
tag = models.CharField(
max_length=20,
validators=[validators.validate_tag_name],
)
class Meta:
default_permissions = ()
verbose_name = 'Slider'
verbose_name_plural = 'Sliders'
def __str__(self):
return self.section
我想在序列化器中组合的下一个模型是
class SliderImage(BaseModel):
image = models.ImageField(
upload_to=upload_slider_image_to,
validators=[],
null=True, blank=True
)
slider = models.ForeignKey(Slider,
on_delete=models.CASCADE,
related_name='slider_image',
)
class Meta:
default_permissions = ()
verbose_name = 'Slider Image'
verbose_name_plural = 'Slider Images'
现在有什么办法可以让我通过这种方式获取序列化程序吗?
预期的序列化器为
"sliders": [
{
"images": [
"http://34.202.219.142:8000/media/promotion/slider/slider_56cc1829-aa78-40e3-9163-2c7297358de0.png",
"http://34.202.219.142:8000/media/promotion/slider/slider_4ea6d488-a1f6-4a0a-b522-ae0285e482df.png",
"http://34.202.219.142:8000/media/promotion/slider/slider_29862eb0-7a2a-4cc4-90b0-3ec5de510d75.png"
],
"section": "bus company",
"tag": "hot-deals"
},
我在序列化程序中试过这个
class SliderSerializers(serializers.ModelSerializer):
class Meta:
model = Slider
fields = '__all__'
class ListSliderSerializer(SliderSerializers):
class Meta(SliderSerializers.Meta):
fields = (
'section',
'tag',
)
class GetHomePagePromotionSerializer(serializers.Serializer):
sliders = ListSliderSerializer(many=True, read_only=True)
我在 usecases.py 和 views.py 中按以下方式序列化
#用例
class GetHomePagePromotionUseCase(BaseUseCase):
def execute(self):
self._factory()
return self._home_page_promotion
def _factory(self):
self._home_page_promotion = {
'sliders': self.list_home_sliders(),
}
def list_home_sliders(self):
return SliderImage.objects.all()
#views.py
class GetHomePagePromotionView(generics.RetrieveAPIView):
"""
Use this end-point to get promotion items for the home page
"""
serializer_class = GetHomePagePromotionSerializer
def get_object(self):
return GetHomePagePromotionUseCase().execute()
我是新手,希望我能澄清我的问题。
【问题讨论】:
-
添加您的序列化程序类。另外,添加 current 输出和 expected 输出也
标签: python django api django-rest-framework