【发布时间】:2019-12-24 12:41:52
【问题描述】:
我有一个周期性的 celery 任务,需要在特定的 json 字段中存储对象的表示。
这是简化的模型结构。 父
所以基本上我有一个 '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
这是为模型定义的序列化程序。
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__'
这是执行所需的周期性 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()
上面的任务得到子图像的输出,像这样,图像字段是相对路径而不是绝对路径。
{
"id": 1
"image": '/api/col/info.jpg'
}
有没有办法获取图片字段的绝对路径?
{
"id": 1
"image": "http://localhost:8000/admin/media/api/col/info.jpg"
}
PS: 我无法将 Request context 作为 ParentSerializer(parent, context={'request': request}) 传递给序列化程序,因为这里不涉及任何请求对象。
【问题讨论】:
-
如果您安装了
django.contrib.sites,您可以使用Site.objects.get_current()获取主机名(这将是您在数据库中配置的站点)。settings.MEDIA_URL是你的路径前缀。 -
如果没有请求对象,则无法访问主机,因此您必须使用预定义的主机并将其添加到 URL 或使用设置中允许的主机之一。
标签: python django django-rest-framework celery