How to form proper URL in DRF Serializer outside of the View?

Viewed 18

Inside a View when defining serializer I can pass request context from View to form absolute image URL

serializer = GroupMembersSerializer(gm, context={"request": request})
{
  "image": "http://hostname/media/group/image.png"
}

I want to send data through websocket from Django signal. But when I am trying code example below my URL only shows relative path

@receiver(signal=post_save, sender=GroupMembers)
def post_save_group_members(instance: GroupMembers, created: bool, *args, **kwargs):
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        f"user_{instance.member.id}",
        {
            'type': 'groupdetails.create',
            'message': GroupMembersSerializer(instance).data
        })
{
  "image": "/media/group/image.png"
}

How do I do it properly so my URL will be absolute?

Edit

class GroupMembersSerializer(serializers.ModelSerializer):
    group = GroupSerializer()

    class Meta:
        model = GroupMembers
        fields = "id", "group", "is_muted"

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = "id", "owner", "name", "description", "image", "is_public"
        read_only_fields = "owner",
def upload_path_group_image(instance, filename: str):
    extension = filename.split(".")[-1]
    today = datetime.today()
    year, month = today.year, today.month
    return f"groups/{year}/{month}/{uuid4()}.{extension}"

class Group(CoreModel):
    owner = models.ForeignKey("user.User", on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=256, null=True, blank=True)
    image = models.ImageField(
        null=True, blank=True, upload_to=upload_path_group_image
    )
    is_public = models.BooleanField(default=False)
    invitation_link = models.CharField(max_length=36, unique=True, default=uuid4)
0 Answers
Related