在 Django Rest Framework 中获取图像字段绝对路径 - 非请求流程

Kar*_* RP 4 python django celery django-rest-framework

我有一个定期的 celery 任务,需要将对象的表示存储在特定的 json 字段中。

这是简化的模型结构。父级 <-- ChildWrapper <-- 子图像

所以基本上我有一个引用“ChildWrapper”的“ChildImage”模型,而“ChildWrapper”又引用“Parent”。

class Parent(TimeStampedModel):
    label = models.CharField(max_length=30, unique=True)
    live_content = JSONField(blank=True, null=True)
    is_template = models.BooleanField(default=False)
    reference_image = models.ImageField(upload_to=get_web_row_reference_image_path, blank=True, null=True)
    # Around 8 Other Fields

    def __str__(self):
        return '%s' % self.label


class ChildWrapper(TimeStampedModel):
    name = models.CharField(max_length=25, blank=True, null=True)
    row = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='web_column')
    order = models.PositiveIntegerField(default=0)
    # Around 20 Other Fields

    def __str__(self):
        return '%s' % self.name


class ChildImage(TimeStampedModel):
    image = models.ImageField(upload_to=get_web_image_path)
    column = models.ForeignKey(ChildWrapper, on_delete=models.CASCADE, related_name='web_image')
    # Around 10 Other Fields
 
    def __str__(self):
        return '%s' % self.column
Run Code Online (Sandbox Code Playgroud)

这是为模型定义的序列化器。

class ChildImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ChildImage
        fields = '__all__'

class ChildWrapperSerializer(serializers.ModelSerializer):
    web_image = ChildImageSerializer(read_only=True, many=True)
    class Meta:
        model = ChildWrapper
        fields = '__all__'

class ParentSerializer(serializers.ModelSerializer):
    web_column = ChildWrapperSerializer(many=True, read_only=True)
    class Meta:
        model = Parent
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

这是定期执行的 celery 任务,它执行所需的操作

@app.task(bind=True)
def update_data(self):
    # Get Parent By a condition.
    parent = Parent.objects.filter(to_update=True).first()

    parent.live_content = None
    parent.live_content = ParentSerializer(parent).data
    print(parent.live_content)
    parent.save()

Run Code Online (Sandbox Code Playgroud)

上面的任务获取类似这样的子图像的输出,其中图像字段是相对路径而不是绝对路径。

{
    "id": 1
    "image": '/api/col/info.jpg'
}
Run Code Online (Sandbox Code Playgroud)

有没有办法获得图像字段的绝对路径?

{
    "id": 1
    "image": "http://localhost:8000/admin/media/api/col/info.jpg"
}
Run Code Online (Sandbox Code Playgroud)

PS: 我无法将请求上下文作为ParentSerializer(parent, context={'request': request})传递给序列化器,因为这里不涉及请求对象。

小智 6

, context={'request': request}我通过添加视图解决了这个问题。

serializer = Business_plansSerializer(business_plans[start:end], many=True, context={'request': request})
Run Code Online (Sandbox Code Playgroud)