【问题标题】:Django Rest Framework Serializer : get fields of two modelsDjango Rest Framework Serializer:获取两个模型的字段
【发布时间】: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


【解决方案1】:

serializers.SerializerMethodField 用作

class ListSliderSerializer(SliderSerializers):
    images = serializers.SerializerMethodField()

    def get_images(self, instance):
        return [slider_image.image.url for slider_image in instance.slider_image.all()]

    class Meta(SliderSerializers.Meta):
        fields = (
            'images',
            'section',
            'tag',
        )

【讨论】:

  • 得到属性错误,说这个'SliderImage'对象没有属性'slider_image'
  • 如何序列化查询集?你能展示你用来序列化数据的代码sn-p吗?
  • 感谢工作几乎成功了,但图像不是以这种模式出现的34.202.219.142:8000/media/promotion/slider/… 而是达到了这一点 ----->>>>media/promotion/slider/slider_56cc1829-aa78-40e3-9163- 2c7297358de0.png 有什么改进吗?
猜你喜欢
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2021-08-07
相关资源
最近更新 更多